From b133cb2468b412683dbc5f19492d98b2ffa47d09 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Wed, 12 Feb 2020 00:09:00 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- GITLAB_ELASTICSEARCH_INDEXER_VERSION | 2 +- app/models/ci/pipeline_schedule.rb | 2 +- app/workers/pipeline_schedule_worker.rb | 6 +- .../20200207132752_add_es_bulk_config.rb | 11 + db/schema.rb | 2 + doc/integration/elasticsearch.md | 2 + ...hboard_stacked_column_panel_type_v12_8.png | Bin 0 -> 13898 bytes doc/user/project/integrations/prometheus.md | 38 +++ .../img/scoped_to_protected_branch_v12_8.png | Bin 0 -> 91714 bytes .../merge_requests/merge_request_approvals.md | 16 + locale/gitlab.pot | 15 + .../environments/environments_app_spec.js | 168 ----------- .../environments/environments_app_spec.js | 279 ++++++++++++++++++ spec/models/ci/pipeline_schedule_spec.rb | 4 +- 14 files changed, 371 insertions(+), 174 deletions(-) create mode 100644 db/migrate/20200207132752_add_es_bulk_config.rb create mode 100644 doc/user/project/integrations/img/prometheus_dashboard_stacked_column_panel_type_v12_8.png create mode 100644 doc/user/project/merge_requests/img/scoped_to_protected_branch_v12_8.png delete mode 100644 spec/frontend/environments/environments_app_spec.js create mode 100644 spec/javascripts/environments/environments_app_spec.js diff --git a/GITLAB_ELASTICSEARCH_INDEXER_VERSION b/GITLAB_ELASTICSEARCH_INDEXER_VERSION index 227cea21564..7ec1d6db408 100644 --- a/GITLAB_ELASTICSEARCH_INDEXER_VERSION +++ b/GITLAB_ELASTICSEARCH_INDEXER_VERSION @@ -1 +1 @@ -2.0.0 +2.1.0 diff --git a/app/models/ci/pipeline_schedule.rb b/app/models/ci/pipeline_schedule.rb index 9a1445e624c..f5785000062 100644 --- a/app/models/ci/pipeline_schedule.rb +++ b/app/models/ci/pipeline_schedule.rb @@ -23,7 +23,7 @@ module Ci scope :active, -> { where(active: true) } scope :inactive, -> { where(active: false) } - scope :preloaded, -> { preload(:owner, :project) } + scope :preloaded, -> { preload(:owner, project: [:route]) } accepts_nested_attributes_for :variables, allow_destroy: true diff --git a/app/workers/pipeline_schedule_worker.rb b/app/workers/pipeline_schedule_worker.rb index 841308611eb..8b326b9dbb6 100644 --- a/app/workers/pipeline_schedule_worker.rb +++ b/app/workers/pipeline_schedule_worker.rb @@ -2,7 +2,7 @@ class PipelineScheduleWorker include ApplicationWorker - include CronjobQueue # rubocop:disable Scalability/CronWorkerContext + include CronjobQueue feature_category :continuous_integration worker_resource_boundary :cpu @@ -10,7 +10,9 @@ class PipelineScheduleWorker def perform Ci::PipelineSchedule.runnable_schedules.preloaded.find_in_batches do |schedules| schedules.each do |schedule| - Ci::PipelineScheduleService.new(schedule.project, schedule.owner).execute(schedule) + with_context(project: schedule.project, user: schedule.owner) do + Ci::PipelineScheduleService.new(schedule.project, schedule.owner).execute(schedule) + end end end end diff --git a/db/migrate/20200207132752_add_es_bulk_config.rb b/db/migrate/20200207132752_add_es_bulk_config.rb new file mode 100644 index 00000000000..c460971139c --- /dev/null +++ b/db/migrate/20200207132752_add_es_bulk_config.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class AddEsBulkConfig < ActiveRecord::Migration[6.0] + # Set this constant to true if this migration requires downtime. + DOWNTIME = false + + def change + add_column :application_settings, :elasticsearch_max_bulk_size_mb, :smallint, null: false, default: 10 + add_column :application_settings, :elasticsearch_max_bulk_concurrency, :smallint, null: false, default: 10 + end +end diff --git a/db/schema.rb b/db/schema.rb index 162964f25e8..a6c2edabeaf 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -344,6 +344,8 @@ ActiveRecord::Schema.define(version: 2020_02_11_152410) do t.boolean "updating_name_disabled_for_users", default: false, null: false t.integer "instance_administrators_group_id" t.integer "elasticsearch_indexed_field_length_limit", default: 0, null: false + t.integer "elasticsearch_max_bulk_size_mb", limit: 2, default: 10, null: false + t.integer "elasticsearch_max_bulk_concurrency", limit: 2, default: 10, null: false t.index ["custom_project_templates_group_id"], name: "index_application_settings_on_custom_project_templates_group_id" t.index ["file_template_project_id"], name: "index_application_settings_on_file_template_project_id" t.index ["instance_administration_project_id"], name: "index_applicationsettings_on_instance_administration_project_id" diff --git a/doc/integration/elasticsearch.md b/doc/integration/elasticsearch.md index 5e0e1919ab7..3ef54ca6dd3 100644 --- a/doc/integration/elasticsearch.md +++ b/doc/integration/elasticsearch.md @@ -151,6 +151,8 @@ The following Elasticsearch settings are available: | `AWS Access Key` | The AWS access key. | | `AWS Secret Access Key` | The AWS secret access key. | | `Maximum field length` | See [the explanation in instance limits.](../administration/instance_limits.md#maximum-field-length). | +| `Maximum bulk request size (MiB)` | Repository indexing uses the Elasticsearch bulk request API. This setting determines the maximum size of an individual bulk request during these operations. | +| `Bulk request concurrency` | Each repository indexing operation may submit bulk requests in parallel. This increases indexing performance, but fills the Elasticsearch bulk requests queue faster. | ### Limiting namespaces and projects diff --git a/doc/user/project/integrations/img/prometheus_dashboard_stacked_column_panel_type_v12_8.png b/doc/user/project/integrations/img/prometheus_dashboard_stacked_column_panel_type_v12_8.png new file mode 100644 index 0000000000000000000000000000000000000000..ba67509bcf367ace29860d74faad20d7b7743a47 GIT binary patch literal 13898 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 literal 0 HcmV?d00001 diff --git a/doc/user/project/integrations/prometheus.md b/doc/user/project/integrations/prometheus.md index bba281ef2ef..66c128314bb 100644 --- a/doc/user/project/integrations/prometheus.md +++ b/doc/user/project/integrations/prometheus.md @@ -356,6 +356,44 @@ Note the following properties: ![anomaly panel type](img/prometheus_dashboard_column_panel_type.png) +##### Stacked column + +> [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/30583) in GitLab 12.8. + +To add a stacked column panel type to a dashboard, look at the following sample dashboard file: + +```yaml +dashboard: 'Dashboard title' +priority: 1 +panel_groups: +- group: 'Group Title' + priority: 5 + panels: + - type: 'stacked-column' + title: "Stacked column" + y_label: "y label" + x_label: 'x label' + metrics: + - id: memory_1 + query_range: 'memory_query' + label: "memory query 1" + unit: "count" + series_name: 'group 1' + - id: memory_2 + query_range: 'memory_query_2' + label: "memory query 2" + unit: "count" + series_name: 'group 2' + +``` + +![stacked column panel type](img/prometheus_dashboard_stacked_column_panel_type_v12_8.png) + +| Property | Type | Required | Description | +| ------ | ------ | ------ | ------ | +| `type` | string | yes | Type of panel to be rendered. For stacked column panel types, set to `stacked-column` | +| `query_range` | yes | yes | For stacked column panel types, you must use a [range query](https://prometheus.io/docs/prometheus/latest/querying/api/#range-queries) | + ##### Single Stat To add a single stat panel type to a dashboard, look at the following sample dashboard file: diff --git a/doc/user/project/merge_requests/img/scoped_to_protected_branch_v12_8.png b/doc/user/project/merge_requests/img/scoped_to_protected_branch_v12_8.png new file mode 100644 index 0000000000000000000000000000000000000000..08a24e9f28eab58769336e1436f333169ba3f1e7 GIT binary patch literal 91714 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

r@_U9fR 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 O3=E#GelF{r5}E+wz&B0+ literal 0 HcmV?d00001 diff --git a/doc/user/project/merge_requests/merge_request_approvals.md b/doc/user/project/merge_requests/merge_request_approvals.md index 854e3a87d65..d378c119aa8 100644 --- a/doc/user/project/merge_requests/merge_request_approvals.md +++ b/doc/user/project/merge_requests/merge_request_approvals.md @@ -147,6 +147,22 @@ reduce the number of approvals left for all rules that the approver belongs to. ![Approvals premium merge request widget](img/approvals_premium_mr_widget_v12_7.png) +### Scoped to Protected Branch **(PREMIUM)** + +> [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/460) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.8. + +Approval rules are often only relevant to specific branches, like `master`. +When configuring [**Default Approval Rules**](#adding--editing-a-default-approval-rule) +these can be scoped to all the protected branches at once by navigating to your project's +**Settings**, expanding **Merge request approvals**, and selecting **Any branch** from +the **Target branch** dropdown. + +Alternatively, you can select a very specific protected branch from the **Target branch** dropdown: + +![Scoped to Protected Branch](img/scoped_to_protected_branch_v12_8.png) + +To enable this configuration, see [Code Owner’s approvals for protected branches](../protected_branches.md#protected-branches-approval-by-code-owners-premium). + ## Adding or removing an approval When an [eligible approver](#eligible-approvers) visits an open merge request, diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 8298d575827..fceb327aed1 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -2999,6 +2999,9 @@ msgstr "" msgid "Built-in" msgstr "" +msgid "Bulk request concurrency" +msgstr "" + msgid "Burndown chart" msgstr "" @@ -11728,9 +11731,15 @@ msgstr "" msgid "Maximum attachment size (MB)" msgstr "" +msgid "Maximum bulk request size (MiB)" +msgstr "" + msgid "Maximum capacity" msgstr "" +msgid "Maximum concurrency of Elasticsearch bulk requests per indexing operation." +msgstr "" + msgid "Maximum delay (Minutes)" msgstr "" @@ -11773,6 +11782,9 @@ msgstr "" msgid "Maximum size limit for each repository." msgstr "" +msgid "Maximum size of Elasticsearch bulk indexing requests." +msgstr "" + msgid "Maximum size of individual attachments in comments." msgstr "" @@ -19578,6 +19590,9 @@ msgstr "" msgid "This namespace has already been taken! Please choose another one." msgstr "" +msgid "This only applies to repository indexing operations." +msgstr "" + msgid "This option is only available on GitLab.com" msgstr "" diff --git a/spec/frontend/environments/environments_app_spec.js b/spec/frontend/environments/environments_app_spec.js deleted file mode 100644 index f3d2bd2462e..00000000000 --- a/spec/frontend/environments/environments_app_spec.js +++ /dev/null @@ -1,168 +0,0 @@ -import { mount, shallowMount } from '@vue/test-utils'; -import axios from '~/lib/utils/axios_utils'; -import MockAdapter from 'axios-mock-adapter'; -import Container from '~/environments/components/container.vue'; -import EmptyState from '~/environments/components/empty_state.vue'; -import EnvironmentsApp from '~/environments/components/environments_app.vue'; -import { environment, folder } from './mock_data'; - -describe('Environment', () => { - let mock; - let wrapper; - - const mockData = { - endpoint: 'environments.json', - canCreateEnvironment: true, - canReadEnvironment: true, - newEnvironmentPath: 'environments/new', - helpPagePath: 'help', - canaryDeploymentFeatureId: 'canary_deployment', - showCanaryDeploymentCallout: true, - userCalloutsPath: '/callouts', - lockPromotionSvgPath: '/assets/illustrations/lock-promotion.svg', - helpCanaryDeploymentsPath: 'help/canary-deployments', - }; - - const mockRequest = (response, body) => { - mock.onGet(mockData.endpoint).reply(response, body, { - 'X-nExt-pAge': '2', - 'x-page': '1', - 'X-Per-Page': '1', - 'X-Prev-Page': '', - 'X-TOTAL': '37', - 'X-Total-Pages': '2', - }); - }; - - const createWrapper = (shallow = false) => { - const fn = shallow ? shallowMount : mount; - wrapper = fn(EnvironmentsApp, { propsData: mockData }); - return axios.waitForAll(); - }; - - beforeEach(() => { - mock = new MockAdapter(axios); - }); - - afterEach(() => { - wrapper.destroy(); - mock.restore(); - }); - - describe('successful request', () => { - describe('without environments', () => { - beforeEach(() => { - mockRequest(200, { environments: [] }); - return createWrapper(true); - }); - - it('should render the empty state', () => { - expect(wrapper.find(EmptyState).exists()).toBe(true); - }); - - describe('when it is possible to enable a review app', () => { - beforeEach(() => { - mockRequest(200, { environments: [], review_app: { can_setup_review_app: true } }); - return createWrapper(); - }); - - it('should render the enable review app button', () => { - expect(wrapper.find('.js-enable-review-app-button').text()).toContain( - 'Enable review app', - ); - }); - }); - }); - - describe('with paginated environments', () => { - const environmentList = [environment]; - - beforeEach(() => { - mockRequest(200, { - environments: environmentList, - stopped_count: 1, - available_count: 0, - }); - return createWrapper(); - }); - - it('should render a conatiner table with environments', () => { - const containerTable = wrapper.find(Container); - - expect(containerTable.exists()).toBe(true); - expect(containerTable.props('environments').length).toEqual(environmentList.length); - expect(containerTable.find('.environment-name').text()).toEqual(environmentList[0].name); - }); - - describe('pagination', () => { - it('should render pagination', () => { - expect(wrapper.findAll('.gl-pagination li').length).toEqual(9); - }); - - it('should make an API request when page is clicked', () => { - jest.spyOn(wrapper.vm, 'updateContent').mockImplementation(() => {}); - - wrapper.find('.gl-pagination li:nth-child(3) .page-link').trigger('click'); - expect(wrapper.vm.updateContent).toHaveBeenCalledWith({ scope: 'available', page: '2' }); - }); - - it('should make an API request when using tabs', () => { - jest.spyOn(wrapper.vm, 'updateContent').mockImplementation(() => {}); - wrapper.find('.js-environments-tab-stopped').trigger('click'); - expect(wrapper.vm.updateContent).toHaveBeenCalledWith({ scope: 'stopped', page: '1' }); - }); - }); - }); - }); - - describe('unsuccessful request', () => { - beforeEach(() => { - mockRequest(500, {}); - return createWrapper(true); - }); - - it('should render empty state', () => { - expect(wrapper.find(EmptyState).exists()).toBe(true); - }); - }); - - describe('expandable folders', () => { - beforeEach(() => { - mockRequest(200, { - environments: [folder], - stopped_count: 1, - available_count: 0, - }); - - mock.onGet(environment.folder_path).reply(200, { environments: [environment] }); - - return createWrapper().then(() => { - // open folder - wrapper.find('.folder-name').trigger('click'); - return axios.waitForAll(); - }); - }); - - it('should open a closed folder', () => { - expect(wrapper.find('.folder-icon.ic-chevron-right').exists()).toBe(false); - }); - - it('should close an opened folder', () => { - expect(wrapper.find('.folder-icon.ic-chevron-down').exists()).toBe(true); - - // close folder - wrapper.find('.folder-name').trigger('click'); - wrapper.vm.$nextTick(() => { - expect(wrapper.find('.folder-icon.ic-chevron-down').exists()).toBe(false); - }); - }); - - it('should show children environments', () => { - expect(wrapper.findAll('.js-child-row').length).toEqual(1); - }); - - it('should show a button to show all environments', () => { - expect(wrapper.find('.text-center > a.btn').text()).toContain('Show all'); - }); - }); -}); diff --git a/spec/javascripts/environments/environments_app_spec.js b/spec/javascripts/environments/environments_app_spec.js new file mode 100644 index 00000000000..6c05b609923 --- /dev/null +++ b/spec/javascripts/environments/environments_app_spec.js @@ -0,0 +1,279 @@ +import Vue from 'vue'; +import MockAdapter from 'axios-mock-adapter'; +import mountComponent from 'spec/helpers/vue_mount_component_helper'; +import axios from '~/lib/utils/axios_utils'; +import environmentsComponent from '~/environments/components/environments_app.vue'; +import { environment, folder } from './mock_data'; + +describe('Environment', () => { + const mockData = { + endpoint: 'environments.json', + canCreateEnvironment: true, + canReadEnvironment: true, + newEnvironmentPath: 'environments/new', + helpPagePath: 'help', + canaryDeploymentFeatureId: 'canary_deployment', + showCanaryDeploymentCallout: true, + userCalloutsPath: '/callouts', + lockPromotionSvgPath: '/assets/illustrations/lock-promotion.svg', + helpCanaryDeploymentsPath: 'help/canary-deployments', + }; + + let EnvironmentsComponent; + let component; + let mock; + + beforeEach(() => { + mock = new MockAdapter(axios); + + EnvironmentsComponent = Vue.extend(environmentsComponent); + }); + + afterEach(() => { + component.$destroy(); + mock.restore(); + }); + + describe('successful request', () => { + describe('without environments', () => { + beforeEach(done => { + mock.onGet(mockData.endpoint).reply(200, { environments: [] }); + + component = mountComponent(EnvironmentsComponent, mockData); + + setTimeout(() => { + done(); + }, 0); + }); + + it('should render the empty state', () => { + expect(component.$el.querySelector('.js-new-environment-button').textContent).toContain( + 'New environment', + ); + + expect(component.$el.querySelector('.js-blank-state-title').textContent).toContain( + "You don't have any environments right now", + ); + }); + + describe('when it is possible to enable a review app', () => { + beforeEach(done => { + mock + .onGet(mockData.endpoint) + .reply(200, { environments: [], review_app: { can_setup_review_app: true } }); + + component = mountComponent(EnvironmentsComponent, mockData); + + setTimeout(() => { + done(); + }, 0); + }); + + it('should render the enable review app button', () => { + expect(component.$el.querySelector('.js-enable-review-app-button').textContent).toContain( + 'Enable review app', + ); + }); + }); + }); + + describe('with paginated environments', () => { + beforeEach(done => { + mock.onGet(mockData.endpoint).reply( + 200, + { + environments: [environment], + stopped_count: 1, + available_count: 0, + }, + { + 'X-nExt-pAge': '2', + 'x-page': '1', + 'X-Per-Page': '1', + 'X-Prev-Page': '', + 'X-TOTAL': '37', + 'X-Total-Pages': '2', + }, + ); + + component = mountComponent(EnvironmentsComponent, mockData); + + setTimeout(() => { + done(); + }, 0); + }); + + it('should render a table with environments', () => { + expect(component.$el.querySelectorAll('table')).not.toBeNull(); + expect(component.$el.querySelector('.environment-name').textContent.trim()).toEqual( + environment.name, + ); + }); + + describe('pagination', () => { + it('should render pagination', () => { + expect(component.$el.querySelectorAll('.gl-pagination li').length).toEqual(9); + }); + + it('should make an API request when page is clicked', done => { + spyOn(component, 'updateContent'); + setTimeout(() => { + component.$el.querySelector('.gl-pagination li:nth-child(3) .page-link').click(); + + expect(component.updateContent).toHaveBeenCalledWith({ scope: 'available', page: '2' }); + done(); + }, 0); + }); + + it('should make an API request when using tabs', done => { + setTimeout(() => { + spyOn(component, 'updateContent'); + component.$el.querySelector('.js-environments-tab-stopped').click(); + + expect(component.updateContent).toHaveBeenCalledWith({ scope: 'stopped', page: '1' }); + done(); + }, 0); + }); + }); + }); + }); + + describe('unsuccessfull request', () => { + beforeEach(done => { + mock.onGet(mockData.endpoint).reply(500, {}); + + component = mountComponent(EnvironmentsComponent, mockData); + + setTimeout(() => { + done(); + }, 0); + }); + + it('should render empty state', () => { + expect(component.$el.querySelector('.js-blank-state-title').textContent).toContain( + "You don't have any environments right now", + ); + }); + }); + + describe('expandable folders', () => { + beforeEach(() => { + mock.onGet(mockData.endpoint).reply( + 200, + { + environments: [folder], + stopped_count: 0, + available_count: 1, + }, + { + 'X-nExt-pAge': '2', + 'x-page': '1', + 'X-Per-Page': '1', + 'X-Prev-Page': '', + 'X-TOTAL': '37', + 'X-Total-Pages': '2', + }, + ); + + mock.onGet(environment.folder_path).reply(200, { environments: [environment] }); + + component = mountComponent(EnvironmentsComponent, mockData); + }); + + it('should open a closed folder', done => { + setTimeout(() => { + component.$el.querySelector('.folder-name').click(); + + Vue.nextTick(() => { + expect(component.$el.querySelector('.folder-icon.ic-chevron-right')).toBe(null); + done(); + }); + }, 0); + }); + + it('should close an opened folder', done => { + setTimeout(() => { + // open folder + component.$el.querySelector('.folder-name').click(); + + Vue.nextTick(() => { + // close folder + component.$el.querySelector('.folder-name').click(); + + Vue.nextTick(() => { + expect(component.$el.querySelector('.folder-icon.ic-chevron-down')).toBe(null); + done(); + }); + }); + }, 0); + }); + + it('should show children environments and a button to show all environments', done => { + setTimeout(() => { + // open folder + component.$el.querySelector('.folder-name').click(); + + Vue.nextTick(() => { + // wait for next async request + setTimeout(() => { + expect(component.$el.querySelectorAll('.js-child-row').length).toEqual(1); + expect(component.$el.querySelector('.text-center > a.btn').textContent).toContain( + 'Show all', + ); + done(); + }); + }); + }, 0); + }); + }); + + describe('methods', () => { + beforeEach(() => { + mock.onGet(mockData.endpoint).reply( + 200, + { + environments: [], + stopped_count: 0, + available_count: 1, + }, + {}, + ); + + component = mountComponent(EnvironmentsComponent, mockData); + spyOn(window.history, 'pushState').and.stub(); + }); + + describe('updateContent', () => { + it('should set given parameters', done => { + component + .updateContent({ scope: 'stopped', page: '3' }) + .then(() => { + expect(component.page).toEqual('3'); + expect(component.scope).toEqual('stopped'); + expect(component.requestData.scope).toEqual('stopped'); + expect(component.requestData.page).toEqual('3'); + done(); + }) + .catch(done.fail); + }); + }); + + describe('onChangeTab', () => { + it('should set page to 1', () => { + spyOn(component, 'updateContent'); + component.onChangeTab('stopped'); + + expect(component.updateContent).toHaveBeenCalledWith({ scope: 'stopped', page: '1' }); + }); + }); + + describe('onChangePage', () => { + it('should update page and keep scope', () => { + spyOn(component, 'updateContent'); + component.onChangePage(4); + + expect(component.updateContent).toHaveBeenCalledWith({ scope: component.scope, page: '4' }); + }); + }); + }); +}); diff --git a/spec/models/ci/pipeline_schedule_spec.rb b/spec/models/ci/pipeline_schedule_spec.rb index aee43025288..4ed4b7e38d8 100644 --- a/spec/models/ci/pipeline_schedule_spec.rb +++ b/spec/models/ci/pipeline_schedule_spec.rb @@ -80,9 +80,9 @@ describe Ci::PipelineSchedule do it 'preloads the associations' do subject - query = ActiveRecord::QueryRecorder.new { subject.each(&:project) } + query = ActiveRecord::QueryRecorder.new { subject.map(&:project).each(&:route) } - expect(query.count).to eq(2) + expect(query.count).to eq(3) end end -- GitLab