From 8d96319c8074a76e761010f1592034b843b0277e Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Wed, 1 Jul 2020 00:09:02 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- .../javascripts/snippets/components/show.vue | 13 +- .../snippets/components/snippet_blob_view.vue | 70 +++---- .../snippets/components/snippet_header.vue | 7 +- .../fragments/snippetBase.fragment.graphql | 2 +- .../javascripts/snippets/mixins/snippets.js | 2 + .../stylesheets/components/popover.scss | 27 --- app/assets/stylesheets/framework/common.scss | 35 ---- .../stylesheets/framework/variables.scss | 1 - .../types/root_storage_statistics_type.rb | 1 + app/views/layouts/application.html.haml | 2 - .../header/_current_user_dropdown.html.haml | 1 - .../layouts/header/_help_dropdown.html.haml | 1 - .../unreleased/217786-snippet-blobs.yml | 5 + ...s-size-to-root-storage-statistics-type.yml | 5 + ...trument-lazily-consumed-gitaly-streams.yml | 5 + .../geo/replication/datatypes.md | 2 +- .../graphql/reference/gitlab_schema.graphql | 5 + doc/api/graphql/reference/gitlab_schema.json | 18 ++ doc/api/graphql/reference/index.md | 1 + doc/ci/runners/README.md | 26 ++- .../group_security_dashboard_v13_2_noNav.png | Bin 0 -> 53913 bytes ...urity_dashboard_with_projects_v13_2_sm.png | Bin 0 -> 58332 bytes ...project_security_dashboard_v13_2_noNav.png | Bin 0 -> 26068 bytes .../security_dashboard/index.md | 117 +++++------ .../project/clusters/add_remove_clusters.md | 41 ++-- doc/user/project/clusters/img/rbac.png | Bin 15960 -> 0 bytes doc/user/project/clusters/img/rbac_v13_1.png | Bin 0 -> 10680 bytes lib/gitlab/gitaly_client.rb | 32 +-- lib/gitlab/gitaly_client/blob_service.rb | 38 ++-- lib/gitlab/gitaly_client/call.rb | 72 +++++++ lib/gitlab/gitaly_client/cleanup_service.rb | 7 +- lib/gitlab/gitaly_client/commit_service.rb | 47 ++--- lib/gitlab/gitaly_client/conflicts_service.rb | 5 +- lib/gitlab/gitaly_client/ref_service.rb | 74 +++---- .../gitaly_client/repository_service.rb | 12 +- locale/gitlab.pot | 183 ------------------ package.json | 4 +- qa/qa/page/main/login.rb | 4 - .../2_plan/issue/jira_issue_import_spec.rb | 2 +- spec/frontend/blob/components/mock_data.js | 14 ++ .../frontend/snippets/components/show_spec.js | 35 +++- .../components/snippet_blob_view_spec.js | 38 ++-- .../components/snippet_header_spec.js | 19 +- .../root_storage_statistics_type_spec.rb | 2 +- spec/lib/gitlab/gitaly_client/call_spec.rb | 122 ++++++++++++ .../gitaly_client/cleanup_service_spec.rb | 6 - spec/lib/gitlab/gitaly_client_spec.rb | 2 - yarn.lock | 16 +- 48 files changed, 542 insertions(+), 579 deletions(-) create mode 100644 changelogs/unreleased/217786-snippet-blobs.yml create mode 100644 changelogs/unreleased/fj-224658-add-snippets-size-to-root-storage-statistics-type.yml create mode 100644 changelogs/unreleased/osw-instrument-lazily-consumed-gitaly-streams.yml create mode 100644 doc/user/application_security/security_dashboard/img/group_security_dashboard_v13_2_noNav.png create mode 100644 doc/user/application_security/security_dashboard/img/instance_security_dashboard_with_projects_v13_2_sm.png create mode 100644 doc/user/application_security/security_dashboard/img/project_security_dashboard_v13_2_noNav.png delete mode 100644 doc/user/project/clusters/img/rbac.png create mode 100644 doc/user/project/clusters/img/rbac_v13_1.png create mode 100644 lib/gitlab/gitaly_client/call.rb create mode 100644 spec/lib/gitlab/gitaly_client/call_spec.rb diff --git a/app/assets/javascripts/snippets/components/show.vue b/app/assets/javascripts/snippets/components/show.vue index bc0034d397e..0779e87e6b6 100644 --- a/app/assets/javascripts/snippets/components/show.vue +++ b/app/assets/javascripts/snippets/components/show.vue @@ -1,19 +1,27 @@ diff --git a/app/assets/javascripts/snippets/components/snippet_blob_view.vue b/app/assets/javascripts/snippets/components/snippet_blob_view.vue index 7472aff3318..afd038eef58 100644 --- a/app/assets/javascripts/snippets/components/snippet_blob_view.vue +++ b/app/assets/javascripts/snippets/components/snippet_blob_view.vue @@ -1,6 +1,4 @@ diff --git a/app/assets/javascripts/snippets/components/snippet_header.vue b/app/assets/javascripts/snippets/components/snippet_header.vue index 2a06296cb15..4bd1453830c 100644 --- a/app/assets/javascripts/snippets/components/snippet_header.vue +++ b/app/assets/javascripts/snippets/components/snippet_header.vue @@ -65,14 +65,17 @@ export default { }; }, computed: { + snippetHasBinary() { + return Boolean(this.snippet.blobs.find(blob => blob.binary)); + }, personalSnippetActions() { return [ { condition: this.snippet.userPermissions.updateSnippet, text: __('Edit'), href: this.editLink, - disabled: this.snippet.blob.binary, - title: this.snippet.blob.binary + disabled: this.snippetHasBinary, + title: this.snippetHasBinary ? __('Snippets with non-text files can only be edited via Git.') : undefined, }, diff --git a/app/assets/javascripts/snippets/fragments/snippetBase.fragment.graphql b/app/assets/javascripts/snippets/fragments/snippetBase.fragment.graphql index e7765dfd8ba..2cca71708ca 100644 --- a/app/assets/javascripts/snippets/fragments/snippetBase.fragment.graphql +++ b/app/assets/javascripts/snippets/fragments/snippetBase.fragment.graphql @@ -11,7 +11,7 @@ fragment SnippetBase on Snippet { webUrl httpUrlToRepo sshUrlToRepo - blob { + blobs { binary name path diff --git a/app/assets/javascripts/snippets/mixins/snippets.js b/app/assets/javascripts/snippets/mixins/snippets.js index 837c41cdf6b..87a00cb8e90 100644 --- a/app/assets/javascripts/snippets/mixins/snippets.js +++ b/app/assets/javascripts/snippets/mixins/snippets.js @@ -11,6 +11,7 @@ export const getSnippetMixin = { }, update: data => data.snippets.edges[0]?.node, result(res) { + this.blobs = res.data.snippets.edges[0].node.blobs; if (this.onSnippetFetch) { this.onSnippetFetch(res); } @@ -27,6 +28,7 @@ export const getSnippetMixin = { return { snippet: {}, newSnippet: false, + blobs: [], }; }, computed: { diff --git a/app/assets/stylesheets/components/popover.scss b/app/assets/stylesheets/components/popover.scss index 1e78781f4b8..18361dfc899 100644 --- a/app/assets/stylesheets/components/popover.scss +++ b/app/assets/stylesheets/components/popover.scss @@ -100,26 +100,6 @@ } } -.onboarding-popover { - box-shadow: 0 2px 4px $dropdown-shadow-color; - max-width: 280px; - - .popover-body { - font-size: $gl-font-size; - line-height: $gl-line-height; - padding: $gl-padding; - } - - .popover-header { - display: none; - } - - .accept-mr-label { - background-color: $accepting-mr-label-color; - color: $white; - } -} - /** * user_popover component */ @@ -132,13 +112,6 @@ } } -.onboarding-welcome-page { - .popover { - min-width: auto; - max-width: 40%; - } -} - .suggest-gitlab-ci-yml { margin-top: -1em; diff --git a/app/assets/stylesheets/framework/common.scss b/app/assets/stylesheets/framework/common.scss index c98b7eb8937..6435d7a8fa0 100644 --- a/app/assets/stylesheets/framework/common.scss +++ b/app/assets/stylesheets/framework/common.scss @@ -549,41 +549,6 @@ img.emoji { } } -.onboarding-helper-container { - bottom: 40px; - right: 40px; - font-size: $gl-font-size-small; - background: $gray-50; - width: 200px; - border-radius: 24px; - box-shadow: 0 2px 4px $issue-boards-card-shadow; - z-index: 10000; - - .collapsible { - max-height: 0; - transition: max-height 0.5s cubic-bezier(0, 1, 0, 1); - } - - &.expanded { - border-bottom-right-radius: $border-radius-default; - border-bottom-left-radius: $border-radius-default; - - .collapsible { - max-height: 1000px; - transition: max-height 1s ease-in-out; - } - } - - .avatar { - border-color: darken($gray-normal, 10%); - - img { - width: 32px; - height: 32px; - } - } -} - .gl-font-sm { font-size: $gl-font-size-small; } .gl-font-lg { font-size: $gl-font-size-large; } .gl-font-base { font-size: $gl-font-size-14; } diff --git a/app/assets/stylesheets/framework/variables.scss b/app/assets/stylesheets/framework/variables.scss index dbb5f962d3e..22cafc8d1fe 100644 --- a/app/assets/stylesheets/framework/variables.scss +++ b/app/assets/stylesheets/framework/variables.scss @@ -711,7 +711,6 @@ $input-lg-width: 320px; */ $document-index-color: #888; $help-shortcut-header-color: #333; -$accepting-mr-label-color: #69d100; /* * Issues diff --git a/app/graphql/types/root_storage_statistics_type.rb b/app/graphql/types/root_storage_statistics_type.rb index e2d85aebc48..3acc1d9ca44 100644 --- a/app/graphql/types/root_storage_statistics_type.rb +++ b/app/graphql/types/root_storage_statistics_type.rb @@ -12,5 +12,6 @@ module Types field :build_artifacts_size, GraphQL::FLOAT_TYPE, null: false, description: 'The CI artifacts size in bytes' field :packages_size, GraphQL::FLOAT_TYPE, null: false, description: 'The packages size in bytes' field :wiki_size, GraphQL::FLOAT_TYPE, null: false, description: 'The wiki size in bytes' + field :snippets_size, GraphQL::FLOAT_TYPE, null: false, description: 'The snippets size in bytes' end end diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index eb58115451d..add72d2312c 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -13,6 +13,4 @@ = render 'layouts/page', sidebar: sidebar, nav: nav = footer_message - = render_if_exists "shared/onboarding_guide" - = yield :scripts_body diff --git a/app/views/layouts/header/_current_user_dropdown.html.haml b/app/views/layouts/header/_current_user_dropdown.html.haml index d568086f4a4..4c659241f99 100644 --- a/app/views/layouts/header/_current_user_dropdown.html.haml +++ b/app/views/layouts/header/_current_user_dropdown.html.haml @@ -35,7 +35,6 @@ = link_to _("Help"), help_path %li.d-md-none = link_to _("Support"), support_url - = render_if_exists "shared/learn_gitlab_menu_item" %li.d-md-none = link_to _("Submit feedback"), "https://about.gitlab.com/submit-feedback" - if current_user_menu?(:help) || current_user_menu?(:settings) || current_user_menu?(:profile) diff --git a/app/views/layouts/header/_help_dropdown.html.haml b/app/views/layouts/header/_help_dropdown.html.haml index 2b3f5d266b0..ad4e0f1f4b2 100644 --- a/app/views/layouts/header/_help_dropdown.html.haml +++ b/app/views/layouts/header/_help_dropdown.html.haml @@ -9,7 +9,6 @@ %button.js-shortcuts-modal-trigger{ type: "button" } = _("Keyboard shortcuts") %span.text-secondary.float-right{ "aria-hidden": true }= '?'.html_safe - = render_if_exists "shared/learn_gitlab_menu_item" %li.divider %li = link_to _("Submit feedback"), "https://about.gitlab.com/submit-feedback" diff --git a/changelogs/unreleased/217786-snippet-blobs.yml b/changelogs/unreleased/217786-snippet-blobs.yml new file mode 100644 index 00000000000..3c812eb5704 --- /dev/null +++ b/changelogs/unreleased/217786-snippet-blobs.yml @@ -0,0 +1,5 @@ +--- +title: Accept multiple blobs in snippets +merge_request: 35605 +author: +type: changed diff --git a/changelogs/unreleased/fj-224658-add-snippets-size-to-root-storage-statistics-type.yml b/changelogs/unreleased/fj-224658-add-snippets-size-to-root-storage-statistics-type.yml new file mode 100644 index 00000000000..31d21fd5225 --- /dev/null +++ b/changelogs/unreleased/fj-224658-add-snippets-size-to-root-storage-statistics-type.yml @@ -0,0 +1,5 @@ +--- +title: Add snippets_size to RootStorageStatisticsType +merge_request: 35586 +author: +type: changed diff --git a/changelogs/unreleased/osw-instrument-lazily-consumed-gitaly-streams.yml b/changelogs/unreleased/osw-instrument-lazily-consumed-gitaly-streams.yml new file mode 100644 index 00000000000..4969d0f4dc8 --- /dev/null +++ b/changelogs/unreleased/osw-instrument-lazily-consumed-gitaly-streams.yml @@ -0,0 +1,5 @@ +--- +title: Add instrumentation to Gitaly streamed responses +merge_request: 35283 +author: +type: fixed diff --git a/doc/administration/geo/replication/datatypes.md b/doc/administration/geo/replication/datatypes.md index 8f48e0df4d4..de8263166ad 100644 --- a/doc/administration/geo/replication/datatypes.md +++ b/doc/administration/geo/replication/datatypes.md @@ -159,7 +159,7 @@ successfully, you must replicate their data using some other means. | [Composer Repository](../../../user/packages/composer_repository/index.md) | **Yes** (13.2) | No | | | [External merge request diffs](../../merge_request_diffs.md) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/33817) | No | | | [Terraform State](../../terraform_state.md) | [No](https://gitlab.com/groups/gitlab-org/-/epics/3112)(*3*) | No | | -| [Vulnerability Export](../../../user/application_security/security_dashboard/#export-vulnerabilities-1) | [No](https://gitlab.com/groups/gitlab-org/-/epics/3111)(*3*) | No | | | +| [Vulnerability Export](../../../user/application_security/security_dashboard/#export-vulnerabilities) | [No](https://gitlab.com/groups/gitlab-org/-/epics/3111)(*3*) | No | | | | Content in object storage | **Yes** (12.4) | No | | - (*1*): The integrity can be verified manually using diff --git a/doc/api/graphql/reference/gitlab_schema.graphql b/doc/api/graphql/reference/gitlab_schema.graphql index ba5a22e070f..12b025e25b6 100644 --- a/doc/api/graphql/reference/gitlab_schema.graphql +++ b/doc/api/graphql/reference/gitlab_schema.graphql @@ -11244,6 +11244,11 @@ type RootStorageStatistics { """ repositorySize: Float! + """ + The snippets size in bytes + """ + snippetsSize: Float! + """ The total storage in bytes """ diff --git a/doc/api/graphql/reference/gitlab_schema.json b/doc/api/graphql/reference/gitlab_schema.json index 76fd767d002..d91f0e74c2b 100644 --- a/doc/api/graphql/reference/gitlab_schema.json +++ b/doc/api/graphql/reference/gitlab_schema.json @@ -33011,6 +33011,24 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "snippetsSize", + "description": "The snippets size in bytes", + "args": [ + + ], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "storageSize", "description": "The total storage in bytes", diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md index f25f99b3ee2..25d2ef9010f 100644 --- a/doc/api/graphql/reference/index.md +++ b/doc/api/graphql/reference/index.md @@ -1623,6 +1623,7 @@ Counts of requirements by their state. | `lfsObjectsSize` | Float! | The LFS objects size in bytes | | `packagesSize` | Float! | The packages size in bytes | | `repositorySize` | Float! | The Git repository size in bytes | +| `snippetsSize` | Float! | The snippets size in bytes | | `storageSize` | Float! | The total storage in bytes | | `wikiSize` | Float! | The wiki size in bytes | diff --git a/doc/ci/runners/README.md b/doc/ci/runners/README.md index a68483f215c..523c07d6b7a 100644 --- a/doc/ci/runners/README.md +++ b/doc/ci/runners/README.md @@ -35,16 +35,20 @@ Use shared Runners when you have multiple jobs with similar requirements. Rather having multiple Runners idling for many projects, you can have a few Runners that handle multiple projects. -If you are using a self-managed instance of GitLab, your administrator can create -shared Runners and configure them to use the -[executor](https://docs.gitlab.com/runner/executors/README.html) you want. -The administrator can also configure a maximum number of Shared Runner [pipeline minutes for -each group](../../user/admin_area/settings/continuous_integration.md#shared-runners-pipeline-minutes-quota-starter-only). +If you are using a self-managed instance of GitLab: -If you are using GitLab.com, you can select from a list of -[shared Runners that GitLab maintains](../../user/gitlab_com/index.md#shared-runners). -When you use the GitLab.com shared Runners, they consume the -[pipelines minutes](../../subscriptions/index.md#ci-pipeline-minutes) included with your account. +- Your administrator can + [install](https://docs.gitlab.com/runner/install/index.html) + and [register](https://docs.gitlab.com/runner/register/index.html) shared Runners, + and configure them to use the [executor](https://docs.gitlab.com/runner/executors/README.html) you want. +- The administrator can also configure a maximum number of shared Runner [pipeline minutes for + each group](../../user/admin_area/settings/continuous_integration.md#shared-runners-pipeline-minutes-quota-starter-only). + +If you are using GitLab.com: + +- You can select from a list of [shared Runners that GitLab maintains](../../user/gitlab_com/index.md#shared-runners). +- The shared Runners consume the [pipelines minutes](../../subscriptions/index.md#ci-pipeline-minutes) + included with your account. #### How shared Runners pick jobs @@ -101,7 +105,9 @@ The fair usage algorithm assigns jobs in this order: #### Enable a shared Runner -By default, all projects can use shared Runners, and they are enabled by default. +On GitLab.com, or after a self-managed GitLab administrator has installed and +registered them, [shared Runners](#shared-runners) are enabled in all projects by +default. However, you can enable or disable shared Runners for individual projects. diff --git a/doc/user/application_security/security_dashboard/img/group_security_dashboard_v13_2_noNav.png b/doc/user/application_security/security_dashboard/img/group_security_dashboard_v13_2_noNav.png new file mode 100644 index 0000000000000000000000000000000000000000..d6cfc2de98089841e55fe5443b97a62e4fc4d016 GIT binary patch literal 53913 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 AF8}}l literal 0 HcmV?d00001 diff --git a/doc/user/application_security/security_dashboard/index.md b/doc/user/application_security/security_dashboard/index.md index c12ce677de3..d7f4e15efd3 100644 --- a/doc/user/application_security/security_dashboard/index.md +++ b/doc/user/application_security/security_dashboard/index.md @@ -12,7 +12,7 @@ vulnerabilities in your groups, projects and pipelines. You can also drill down into a vulnerability and get extra information, see which project it comes from, the file it's in, and various metadata to help you analyze -the risk. You can also action these vulnerabilities by creating an issue for them, +the risk. You can also take actions on vulnerabilities by creating an issue for them, or by dismissing them. To benefit from the Security Dashboard you must first configure one of the @@ -54,56 +54,52 @@ A pipeline consists of multiple jobs, including SAST and DAST scanning. If any j > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/6165) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 11.1. -At the project level, the Security Dashboard displays the latest security reports for your project. -Use it to find and fix vulnerabilities. +At the project level, the Security Dashboard displays the vulnerabilities merged into your project's +[default branch](../../project/repository/branches/index.md#default-branch). Access it by navigating +to **Security & Compliance > Security Dashboard**. -![Project Security Dashboard](img/project_security_dashboard_v13_0.png) +The Security Dashboard first displays the total number of vulnerabilities by severity (for example, +Critical, High, Medium, Low). Below this, a table displays each vulnerability's status, severity, +and description. Clicking a vulnerability takes you to its [Vulnerability Details](../vulnerabilities) +page to view more information about that vulnerability. -### Export vulnerabilities - -> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/197494) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.10. - -You can export all your project's vulnerabilities as CSV by clicking on the export button located at top right of the Project Security Dashboard. This will initiate the process, and once complete, the CSV report will be downloaded. The report will contain all vulnerabilities in the project as filters won't apply. - -NOTE: **Note:** -It may take several minutes for the download to start if your project consists -of thousands of vulnerabilities. Do not close the page until the download finishes. - -![CSV Export Button](img/project_security_dashboard_export_csv_v12_10.png) - -## Group Security Dashboard - -> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/6709) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 11.5. - -The group Security Dashboard gives an overview of the vulnerabilities of all the -projects in a group and its subgroups. - -First, navigate to the Security Dashboard found under your group's -**Security** tab. - -Once you're on the dashboard, at the top you should see a series of filters for: +You can filter the vulnerabilities by: - Status - Severity - Report type +You can also dismiss vulnerabilities in the table: + +1. Select the checkbox for each vulnerability you want to dismiss. +1. In the menu that appears, select the reason for dismissal and click **Dismiss Selected**. + +![Project Security Dashboard](img/project_security_dashboard_v13_2_noNav.png) + +## Group Security Dashboard + +> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/6709) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 11.5. + +The group Security Dashboard gives an overview of the vulnerabilities in the default branches of the +projects in a group and its subgroups. Access it by navigating to **Security > Security Dashboard** +for your group. + NOTE: **Note:** -The dashboard only shows projects with [security reports](#supported-reports) enabled in a group. +The Security Dashboard only shows projects with [security reports](#supported-reports) enabled in a +group. -![Dashboard with action buttons and metrics](img/group_security_dashboard_v13_2.png) +![Dashboard with action buttons and metrics](img/group_security_dashboard_v13_2_noNav.png) -Selecting one or more filters will filter the results in this page. +You can filter which vulnerabilities the Security Dashboard displays by: -The main section is a list of all the vulnerabilities in the group, sorted by severity. -In that list, you can see the severity of the vulnerability, its name, its -confidence (likelihood of the vulnerability to be a positive one), and the project -it's from. +- Status +- Severity +- Report type +- Project -If you hover over a row, the following actions appear: - -- More info -- Create issue -- Dismiss vulnerability +A table lists the vulnerabilities, sorted by severity. The table shows each vulnerability's status, +severity, and description. Clicking a vulnerability takes you to its [Vulnerability Details](../vulnerabilities) +page to view more information about that vulnerability. Next to the list is a timeline chart that shows how many open vulnerabilities your projects had at various points in time. You can filter among 30, 60, and @@ -123,28 +119,14 @@ vulnerabilities are not included either. Read more on how to [interact with the vulnerabilities](../index.md#interacting-with-the-vulnerabilities). -### Export vulnerabilities - -> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/213013) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.1. - -You can export all your vulnerabilities as CSV by clicking the **{upload}** **Export** button -located at the top right of the **Group Security Dashboard**. After the report builds, the CSV -report downloads to your local machine. The report contains all vulnerabilities for the projects -defined in the **Group Security Dashboard**, as filters don't apply to the export function. - -NOTE: **Note:** -It may take several minutes for the download to start if your project contains thousands of -vulnerabilities. Don't close the page until the download finishes. - -![CSV Export Button](img/group_security_dashboard_export_csv_v13_1.png) - ## Instance Security Dashboard > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/6953) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.8. -At the instance level, the Security Dashboard displays the vulnerabilities -present in all of the projects that you have added to it. It includes all -of the features of the [group security dashboard](#group-security-dashboard). +At the instance level, the Security Dashboard displays the vulnerabilities present in the default +branches of all the projects you configure to display on the dashboard. It includes all the +[group Security Dashboard's](#group-security-dashboard) +features. You can access the Instance Security Dashboard from the menu bar at the top of the page. Under **More**, select **Security**. @@ -159,27 +141,25 @@ To add projects to the dashboard: 1. Search for and add one or more projects using the **Search your projects** field. 1. Click the **Add projects** button. -Once added, the dashboard will display the vulnerabilities found in your chosen -projects. +Once added, the Security Dashboard displays the vulnerabilities found in your chosen projects' +default branches. -![Instance Security Dashboard with projects](img/instance_security_dashboard_with_projects_v13_2.png) +![Instance Security Dashboard with projects](img/instance_security_dashboard_with_projects_v13_2_sm.png) -### Export vulnerabilities +## Export vulnerabilities -> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/213014) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.0. +> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/213014) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.10. -You can export all your vulnerabilities as CSV by clicking the **{upload}** **Export** -button located at top right of the **Instance Security Dashboard**. After the report +You can export all your vulnerabilities in CSV format by clicking the **{upload}** **Export** +button located at top right of the **Security Dashboard**. After the report is built, the CSV report downloads to your local machine. The report contains all -vulnerabilities for the projects defined in the **Instance Security Dashboard**, +vulnerabilities for the projects defined in the **Security Dashboard**, as filters don't apply to the export function. NOTE: **Note:** It may take several minutes for the download to start if your project contains thousands of vulnerabilities. Do not close the page until the download finishes. -![CSV Export Button](img/instance_security_dashboard_export_csv_v13_0.png) - ## Keeping the dashboards up to date The Security Dashboard displays information from the results of the most recent @@ -205,7 +185,8 @@ to configure daily security scans. ## Vulnerability list -Each dashboard's vulnerability list contains new vulnerabilities discovered in the latest scans. +Each dashboard's vulnerability list contains vulnerabilities from the latest scans that were merged +into the default branch. Click any vulnerability in the table to see more information on that vulnerability. To create an issue associated with the vulnerability, click the **Create Issue** button. diff --git a/doc/user/project/clusters/add_remove_clusters.md b/doc/user/project/clusters/add_remove_clusters.md index c93d3e6b96e..fbd2814ea75 100644 --- a/doc/user/project/clusters/add_remove_clusters.md +++ b/doc/user/project/clusters/add_remove_clusters.md @@ -28,7 +28,7 @@ Google Kubernetes Engine Integration. All you have to do is [follow this link](h Before [adding a Kubernetes cluster](#create-new-cluster) using GitLab, you need: - GitLab itself. Either: - - A GitLab.com [account](https://about.gitlab.com/pricing/#gitlab-com). + - A [GitLab.com account](https://about.gitlab.com/pricing/#gitlab-com). - A [self-managed installation](https://about.gitlab.com/pricing/#self-managed) with GitLab version 12.5 or later. This will ensure the GitLab UI can be used for cluster creation. - The following GitLab access: @@ -131,7 +131,7 @@ arbitrary images as they effectively have root access. If you don't want to use GitLab Runner in privileged mode, either: - Use shared Runners on GitLab.com. They don't have this security issue. -- Set up your own Runners using configuration described at +- Set up your own Runners using the configuration described at [Shared Runners](../../gitlab_com/index.md#shared-runners). This involves: 1. Making sure that you don't have it installed via [the applications](index.md#installing-applications). @@ -140,10 +140,18 @@ If you don't want to use GitLab Runner in privileged mode, either: ## Create new cluster -New clusters can be created using GitLab for: +New clusters can be created using GitLab on Google Kubernetes Engine (GKE) or +Amazon Elastic Kubernetes Service (EKS) at the project, group, or instance level: -- [Google Kubernetes Engine (GKE)](add_gke_clusters.md). -- [Amazon Elastic Kubernetes Service (EKS)](add_eks_clusters.md). +1. Navigate to your: + - Project's **{cloud-gear}** **Operations > Kubernetes** page, for a project-level cluster. + - Group's **{cloud-gear}** **Kubernetes** page, for a group-level cluster. + - **{admin}** **Admin Area >** **{cloud-gear}** **Kubernetes** page, for an instance-level cluster. +1. Click **Add Kubernetes cluster**. +1. Click the **Create new cluster** tab. +1. Click either **Amazon EKS** or **Google GKE**, and follow the instructions for your desired service: + - [Amazon EKS](add_eks_clusters.md#new-eks-cluster). + - [Google GKE](add_gke_clusters.md#creating-the-cluster-on-gke). ## Add existing cluster @@ -156,7 +164,7 @@ For more information, see information for adding an: NOTE: **Note:** Kubernetes integration is not supported for arm64 clusters. See the issue -[Helm Tiller fails to install on arm64 cluster](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/64044) for details. +[Helm Tiller fails to install on arm64 cluster](https://gitlab.com/gitlab-org/gitlab/-/issues/29838) for details. ### Existing Kubernetes cluster @@ -302,12 +310,12 @@ to install some [pre-defined applications](index.md#installing-applications). When connecting a cluster via GitLab integration, you may specify whether the cluster is RBAC-enabled or not. This will affect how GitLab interacts with the -cluster for certain operations. If you **did not** check the "RBAC-enabled cluster" +cluster for certain operations. If you did *not* check the **RBAC-enabled cluster** checkbox at creation time, GitLab will assume RBAC is disabled for your cluster when interacting with it. If so, you must disable RBAC on your cluster for the integration to work properly. -![rbac](img/rbac.png) +![rbac](img/rbac_v13_1.png) NOTE: **Note**: Disabling RBAC means that any application running in the cluster, or user who can authenticate to the cluster, has full API access. This is a @@ -325,17 +333,20 @@ kubectl create clusterrolebinding permissive-binding \ ## Enabling or disabling integration -After you have successfully added your cluster information, you can enable the -Kubernetes cluster integration: +The Kubernetes cluster integration enables after you have successfully either created +a new cluster or added an existing one. To disable Kubernetes cluster integration: -1. Click the **Enabled/Disabled** switch -1. Hit **Save** for the changes to take effect - -To disable the Kubernetes cluster integration, follow the same procedure. +1. Navigate to your: + - Project's **{cloud-gear}** **Operations > Kubernetes** page, for a project-level cluster. + - Group's **{cloud-gear}** **Kubernetes** page, for a group-level cluster. + - **{admin}** **Admin Area >** **{cloud-gear}** **Kubernetes** page, for an instance-level cluster. +1. Click on the name of the cluster. +1. Click the **GitLab Integration** toggle. +1. Click **Save changes**. ## Removing integration -To remove the Kubernetes cluster integration from your project, either: +To remove the Kubernetes cluster integration from your project, first navigate to the **Advanced Settings** tab of the cluster details page and either: - Select **Remove integration**, to remove only the Kubernetes integration. - [From GitLab 12.6](https://gitlab.com/gitlab-org/gitlab/-/issues/26815), select diff --git a/doc/user/project/clusters/img/rbac.png b/doc/user/project/clusters/img/rbac.png deleted file mode 100644 index 517e4f7ca44b5605b0a5d72812a0af4abc3845e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15960 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 diff --git a/doc/user/project/clusters/img/rbac_v13_1.png b/doc/user/project/clusters/img/rbac_v13_1.png new file mode 100644 index 0000000000000000000000000000000000000000..2772af9ff89eac40d6a59306584a53d0de96efc7 GIT binary patch literal 10680 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 err + store_timings + raise err + end + + private + + def instrument_stream(response) + Enumerator.new do |yielder| + loop do + value = recording_request { response.next } + + yielder.yield(value) + end + ensure + store_timings + end + end + + def recording_request + start = Gitlab::Metrics::System.monotonic_time + + yield + ensure + @duration += Gitlab::Metrics::System.monotonic_time - start + end + + def store_timings + GitalyClient.add_query_time(@duration) + + return unless Gitlab::PerformanceBar.enabled_for_request? + + request_hash = @request.is_a?(Google::Protobuf::MessageExts) ? @request.to_h : {} + + GitalyClient.add_call_details(feature: "#{@service}##{@rpc}", duration: @duration, request: request_hash, rpc: @rpc, + backtrace: Gitlab::BacktraceCleaner.clean_backtrace(caller)) + end + end + end +end diff --git a/lib/gitlab/gitaly_client/cleanup_service.rb b/lib/gitlab/gitaly_client/cleanup_service.rb index 8836d08a807..649aaa46362 100644 --- a/lib/gitlab/gitaly_client/cleanup_service.rb +++ b/lib/gitlab/gitaly_client/cleanup_service.rb @@ -13,15 +13,14 @@ module Gitlab end def apply_bfg_object_map_stream(io, &blk) - GitalyClient.streaming_call( + response = GitalyClient.call( storage, :cleanup_service, :apply_bfg_object_map_stream, build_object_map_enum(io), timeout: GitalyClient.long_timeout - ) do |response| - response.each(&blk) - end + ) + response.each(&blk) end private diff --git a/lib/gitlab/gitaly_client/commit_service.rb b/lib/gitlab/gitaly_client/commit_service.rb index 7761511177d..464d2519b27 100644 --- a/lib/gitlab/gitaly_client/commit_service.rb +++ b/lib/gitlab/gitaly_client/commit_service.rb @@ -72,9 +72,8 @@ module Gitlab def commit_deltas(commit) request = Gitaly::CommitDeltaRequest.new(diff_from_parent_request_params(commit)) - GitalyClient.streaming_call(@repository.storage, :diff_service, :commit_delta, request, timeout: GitalyClient.fast_timeout) do |response| - response.flat_map { |msg| msg.deltas } - end + response = GitalyClient.call(@repository.storage, :diff_service, :commit_delta, request, timeout: GitalyClient.fast_timeout) + response.flat_map { |msg| msg.deltas } end def tree_entry(ref, path, limit = nil) @@ -202,9 +201,8 @@ module Gitlab to: to ) - GitalyClient.streaming_call(@repository.storage, :commit_service, :commits_between, request, timeout: GitalyClient.medium_timeout) do |response| - consume_commits_response(response) - end + response = GitalyClient.call(@repository.storage, :commit_service, :commits_between, request, timeout: GitalyClient.medium_timeout) + consume_commits_response(response) end def diff_stats(left_commit_sha, right_commit_sha) @@ -214,9 +212,8 @@ module Gitlab right_commit_id: right_commit_sha ) - GitalyClient.streaming_call(@repository.storage, :diff_service, :diff_stats, request, timeout: GitalyClient.medium_timeout) do |response| - response.flat_map(&:stats) - end + response = GitalyClient.call(@repository.storage, :diff_service, :diff_stats, request, timeout: GitalyClient.medium_timeout) + response.flat_map(&:stats) end def find_all_commits(opts = {}) @@ -228,9 +225,8 @@ module Gitlab ) request.order = opts[:order].upcase if opts[:order].present? - GitalyClient.streaming_call(@repository.storage, :commit_service, :find_all_commits, request, timeout: GitalyClient.medium_timeout) do |response| - consume_commits_response(response) - end + response = GitalyClient.call(@repository.storage, :commit_service, :find_all_commits, request, timeout: GitalyClient.medium_timeout) + consume_commits_response(response) end def list_commits_by_oid(oids) @@ -238,9 +234,8 @@ module Gitlab request = Gitaly::ListCommitsByOidRequest.new(repository: @gitaly_repo, oid: oids) - GitalyClient.streaming_call(@repository.storage, :commit_service, :list_commits_by_oid, request, timeout: GitalyClient.medium_timeout) do |response| - consume_commits_response(response) - end + response = GitalyClient.call(@repository.storage, :commit_service, :list_commits_by_oid, request, timeout: GitalyClient.medium_timeout) + consume_commits_response(response) rescue GRPC::NotFound # If no repository is found, happens mainly during testing [] end @@ -256,9 +251,8 @@ module Gitlab global_options: parse_global_options!(literal_pathspec: literal_pathspec) ) - GitalyClient.streaming_call(@repository.storage, :commit_service, :commits_by_message, request, timeout: GitalyClient.medium_timeout) do |response| - consume_commits_response(response) - end + response = GitalyClient.call(@repository.storage, :commit_service, :commits_by_message, request, timeout: GitalyClient.medium_timeout) + consume_commits_response(response) end def languages(ref = nil) @@ -334,9 +328,8 @@ module Gitlab request.paths = encode_repeated(Array(options[:path])) if options[:path].present? - GitalyClient.streaming_call(@repository.storage, :commit_service, :find_commits, request, timeout: GitalyClient.medium_timeout) do |response| - consume_commits_response(response) - end + response = GitalyClient.call(@repository.storage, :commit_service, :find_commits, request, timeout: GitalyClient.medium_timeout) + consume_commits_response(response) end def filter_shas_with_signatures(shas) @@ -352,10 +345,9 @@ module Gitlab end end - GitalyClient.streaming_call(@repository.storage, :commit_service, :filter_shas_with_signatures, enum, timeout: GitalyClient.fast_timeout) do |response| - response.flat_map do |msg| - msg.shas.map { |sha| EncodingHelper.encode!(sha) } - end + response = GitalyClient.call(@repository.storage, :commit_service, :filter_shas_with_signatures, enum, timeout: GitalyClient.fast_timeout) + response.flat_map do |msg| + msg.shas.map { |sha| EncodingHelper.encode!(sha) } end end @@ -423,9 +415,8 @@ module Gitlab request_params.merge!(Gitlab::Git::DiffCollection.limits(options).to_h) request = Gitaly::CommitDiffRequest.new(request_params) - GitalyClient.streaming_call(@repository.storage, :diff_service, :commit_diff, request, timeout: GitalyClient.medium_timeout) do |response| - GitalyClient::DiffStitcher.new(response) - end + response = GitalyClient.call(@repository.storage, :diff_service, :commit_diff, request, timeout: GitalyClient.medium_timeout) + GitalyClient::DiffStitcher.new(response) end def diff_from_parent_request_params(commit, options = {}) diff --git a/lib/gitlab/gitaly_client/conflicts_service.rb b/lib/gitlab/gitaly_client/conflicts_service.rb index 3f3c0eb6b4a..6f08dcc69b6 100644 --- a/lib/gitlab/gitaly_client/conflicts_service.rb +++ b/lib/gitlab/gitaly_client/conflicts_service.rb @@ -20,9 +20,8 @@ module Gitlab our_commit_oid: @our_commit_oid, their_commit_oid: @their_commit_oid ) - GitalyClient.streaming_call(@repository.storage, :conflicts_service, :list_conflict_files, request, timeout: GitalyClient.long_timeout) do |response| - GitalyClient::ConflictFilesStitcher.new(response, @gitaly_repo) - end + response = GitalyClient.call(@repository.storage, :conflicts_service, :list_conflict_files, request, timeout: GitalyClient.long_timeout) + GitalyClient::ConflictFilesStitcher.new(response, @gitaly_repo) end def conflicts? diff --git a/lib/gitlab/gitaly_client/ref_service.rb b/lib/gitlab/gitaly_client/ref_service.rb index 68ede77a0cc..e0ccc13234a 100644 --- a/lib/gitlab/gitaly_client/ref_service.rb +++ b/lib/gitlab/gitaly_client/ref_service.rb @@ -14,16 +14,14 @@ module Gitlab def branches request = Gitaly::FindAllBranchesRequest.new(repository: @gitaly_repo) - GitalyClient.streaming_call(@storage, :ref_service, :find_all_branches, request, timeout: GitalyClient.fast_timeout) do |response| - consume_find_all_branches_response(response) - end + response = GitalyClient.call(@storage, :ref_service, :find_all_branches, request, timeout: GitalyClient.fast_timeout) + consume_find_all_branches_response(response) end def remote_branches(remote_name) request = Gitaly::FindAllRemoteBranchesRequest.new(repository: @gitaly_repo, remote_name: remote_name) - GitalyClient.streaming_call(@storage, :ref_service, :find_all_remote_branches, request, timeout: GitalyClient.medium_timeout) do |response| - consume_find_all_remote_branches_response(remote_name, response) - end + response = GitalyClient.call(@storage, :ref_service, :find_all_remote_branches, request, timeout: GitalyClient.medium_timeout) + consume_find_all_remote_branches_response(remote_name, response) end def merged_branches(branch_names = []) @@ -32,9 +30,8 @@ module Gitlab merged_only: true, merged_branches: branch_names.map { |s| encode_binary(s) } ) - GitalyClient.streaming_call(@storage, :ref_service, :find_all_branches, request, timeout: GitalyClient.fast_timeout) do |response| - consume_find_all_branches_response(response) - end + response = GitalyClient.call(@storage, :ref_service, :find_all_branches, request, timeout: GitalyClient.fast_timeout) + consume_find_all_branches_response(response) end def default_branch_name @@ -45,16 +42,14 @@ module Gitlab def branch_names request = Gitaly::FindAllBranchNamesRequest.new(repository: @gitaly_repo) - GitalyClient.streaming_call(@storage, :ref_service, :find_all_branch_names, request, timeout: GitalyClient.fast_timeout) do |response| - consume_refs_response(response) { |name| Gitlab::Git.branch_name(name) } - end + response = GitalyClient.call(@storage, :ref_service, :find_all_branch_names, request, timeout: GitalyClient.fast_timeout) + consume_refs_response(response) { |name| Gitlab::Git.branch_name(name) } end def tag_names request = Gitaly::FindAllTagNamesRequest.new(repository: @gitaly_repo) - GitalyClient.streaming_call(@storage, :ref_service, :find_all_tag_names, request, timeout: GitalyClient.fast_timeout) do |response| - consume_refs_response(response) { |name| Gitlab::Git.tag_name(name) } - end + response = GitalyClient.call(@storage, :ref_service, :find_all_tag_names, request, timeout: GitalyClient.fast_timeout) + consume_refs_response(response) { |name| Gitlab::Git.tag_name(name) } end def find_ref_name(commit_id, ref_prefix) @@ -75,11 +70,10 @@ module Gitlab commits = [] - GitalyClient.streaming_call(@storage, :ref_service, :list_new_commits, request, timeout: GitalyClient.medium_timeout) do |response| - response.each do |msg| - msg.commits.each do |c| - commits << Gitlab::Git::Commit.new(@repository, c) - end + response = GitalyClient.call(@storage, :ref_service, :list_new_commits, request, timeout: GitalyClient.medium_timeout) + response.each do |msg| + msg.commits.each do |c| + commits << Gitlab::Git::Commit.new(@repository, c) end end @@ -100,12 +94,11 @@ module Gitlab GitalyClient.medium_timeout end - GitalyClient.streaming_call(@storage, :ref_service, :list_new_blobs, request, timeout: timeout) do |response| - response.flat_map do |msg| - # Returns an Array of Gitaly::NewBlobObject objects - # Available methods are: #size, #oid and #path - msg.new_blob_objects - end + response = GitalyClient.call(@storage, :ref_service, :list_new_blobs, request, timeout: timeout) + response.flat_map do |msg| + # Returns an Array of Gitaly::NewBlobObject objects + # Available methods are: #size, #oid and #path + msg.new_blob_objects end end @@ -120,16 +113,14 @@ module Gitlab def local_branches(sort_by: nil) request = Gitaly::FindLocalBranchesRequest.new(repository: @gitaly_repo) request.sort_by = sort_by_param(sort_by) if sort_by - GitalyClient.streaming_call(@storage, :ref_service, :find_local_branches, request, timeout: GitalyClient.fast_timeout) do |response| - consume_find_local_branches_response(response) - end + response = GitalyClient.call(@storage, :ref_service, :find_local_branches, request, timeout: GitalyClient.fast_timeout) + consume_find_local_branches_response(response) end def tags request = Gitaly::FindAllTagsRequest.new(repository: @gitaly_repo) - GitalyClient.streaming_call(@storage, :ref_service, :find_all_tags, request, timeout: GitalyClient.medium_timeout) do |response| - consume_tags_response(response) - end + response = GitalyClient.call(@storage, :ref_service, :find_all_tags, request, timeout: GitalyClient.medium_timeout) + consume_tags_response(response) end def ref_exists?(ref_name) @@ -174,9 +165,8 @@ module Gitlab limit: limit ) - GitalyClient.streaming_call(@storage, :ref_service, :list_tag_names_containing_commit, request, timeout: GitalyClient.medium_timeout) do |response| - consume_ref_contains_sha_response(response, :tag_names) - end + response = GitalyClient.call(@storage, :ref_service, :list_tag_names_containing_commit, request, timeout: GitalyClient.medium_timeout) + consume_ref_contains_sha_response(response, :tag_names) end # Limit: 0 implies no limit, thus all tag names will be returned @@ -187,9 +177,8 @@ module Gitlab limit: limit ) - GitalyClient.streaming_call(@storage, :ref_service, :list_branch_names_containing_commit, request, timeout: GitalyClient.medium_timeout) do |response| - consume_ref_contains_sha_response(response, :branch_names) - end + response = GitalyClient.call(@storage, :ref_service, :list_branch_names_containing_commit, request, timeout: GitalyClient.medium_timeout) + consume_ref_contains_sha_response(response, :branch_names) end def get_tag_messages(tag_ids) @@ -197,12 +186,11 @@ module Gitlab messages = Hash.new { |h, k| h[k] = +''.b } current_tag_id = nil - GitalyClient.streaming_call(@storage, :ref_service, :get_tag_messages, request, timeout: GitalyClient.fast_timeout) do |response| - response.each do |rpc_message| - current_tag_id = rpc_message.tag_id if rpc_message.tag_id.present? + response = GitalyClient.call(@storage, :ref_service, :get_tag_messages, request, timeout: GitalyClient.fast_timeout) + response.each do |rpc_message| + current_tag_id = rpc_message.tag_id if rpc_message.tag_id.present? - messages[current_tag_id] << rpc_message.message - end + messages[current_tag_id] << rpc_message.message end messages diff --git a/lib/gitlab/gitaly_client/repository_service.rb b/lib/gitlab/gitaly_client/repository_service.rb index f20568acde9..5b119fe616a 100644 --- a/lib/gitlab/gitaly_client/repository_service.rb +++ b/lib/gitlab/gitaly_client/repository_service.rb @@ -334,9 +334,8 @@ module Gitlab def search_files_by_content(ref, query, options = {}) request = Gitaly::SearchFilesByContentRequest.new(repository: @gitaly_repo, ref: ref, query: query) - GitalyClient.streaming_call(@storage, :repository_service, :search_files_by_content, request, timeout: GitalyClient.default_timeout) do |response| - search_results_from_response(response, options) - end + response = GitalyClient.call(@storage, :repository_service, :search_files_by_content, request, timeout: GitalyClient.default_timeout) + search_results_from_response(response, options) end def disconnect_alternates @@ -403,15 +402,14 @@ module Gitlab def gitaly_fetch_stream_to_file(save_path, rpc_name, request_class, timeout) request = request_class.new(repository: @gitaly_repo) - GitalyClient.streaming_call( + response = GitalyClient.call( @storage, :repository_service, rpc_name, request, timeout: timeout - ) do |response| - write_stream_to_file(response, save_path) - end + ) + write_stream_to_file(response, save_path) end def write_stream_to_file(response, save_path) diff --git a/locale/gitlab.pot b/locale/gitlab.pot index b026af14642..736c25b35e0 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -3424,9 +3424,6 @@ msgstr "" msgid "Badges|e.g. %{exampleUrl}" msgstr "" -msgid "Badge|New" -msgstr "" - msgid "Balsamiq file could not be loaded." msgstr "" @@ -3562,9 +3559,6 @@ msgstr "" msgid "Blog" msgstr "" -msgid "Blue helpers indicate an action to be taken." -msgstr "" - msgid "Board name" msgstr "" @@ -8078,9 +8072,6 @@ msgstr "" msgid "Don't show again" msgstr "" -msgid "Don't worry, you can access this tour by clicking on the help icon in the top right corner and choose Learn GitLab." -msgstr "" - msgid "Done" msgstr "" @@ -11039,9 +11030,6 @@ msgstr "" msgid "Go to your snippets" msgstr "" -msgid "Golden Tanuki" -msgstr "" - msgid "Google Cloud Platform" msgstr "" @@ -15302,9 +15290,6 @@ msgstr "" msgid "No, directly import the existing email addresses and usernames." msgstr "" -msgid "No, not interested right now" -msgstr "" - msgid "No. of commits" msgstr "" @@ -15350,9 +15335,6 @@ msgstr "" msgid "Not found." msgstr "" -msgid "Not helpful" -msgstr "" - msgid "Not now" msgstr "" @@ -15578,9 +15560,6 @@ msgstr "" msgid "Oh no!" msgstr "" -msgid "Ok let's go" -msgstr "" - msgid "Oldest first" msgstr "" @@ -15638,9 +15617,6 @@ msgstr "" msgid "OnDemandScans|Target URL" msgstr "" -msgid "Onboarding" -msgstr "" - msgid "Once imported, repositories can be mirrored over SSH. Read more %{link_start}here%{link_end}." msgstr "" @@ -21019,9 +20995,6 @@ msgstr "" msgid "Skip outdated deployment jobs" msgstr "" -msgid "Skip this for now" -msgstr "" - msgid "Skipped" msgstr "" @@ -24942,150 +24915,6 @@ msgstr "" msgid "UserList|created %{timeago}" msgstr "" -msgid "UserOnboardingTour|%{activeTour}/%{totalTours}" -msgstr "" - -msgid "UserOnboardingTour|%{completed}/%{total} steps completed" -msgstr "" - -msgid "UserOnboardingTour|%{emphasisStart}Well done!%{emphasisEnd}%{lineBreak}%{lineBreak}That's it for our guided tour, congratulations for making it all the way to the end!%{lineBreak}%{lineBreak}We hope this gave you a good overview of GitLab and how it can help you. We'll now show you how to create your own project and invite your colleagues." -msgstr "" - -msgid "UserOnboardingTour|Adding other members to a project is done through Project Settings. Click on %{emphasisStart}Settings%{emphasisEnd}." -msgstr "" - -msgid "UserOnboardingTour|Alright, that's it for Commits. Let's take a look at the %{emphasisStart}Branches%{emphasisEnd}." -msgstr "" - -msgid "UserOnboardingTour|Awesome! Now click on %{emphasisStart}Members%{emphasisEnd}." -msgstr "" - -msgid "UserOnboardingTour|Click on one of the %{emphasisStart}Compare%{emphasisEnd} buttons to compare a branch to master." -msgstr "" - -msgid "UserOnboardingTour|Click on one of the %{emphasisStart}pipeline IDs%{emphasisEnd} to see the details of a pipeline." -msgstr "" - -msgid "UserOnboardingTour|Click to open the latest commit to see its details." -msgstr "" - -msgid "UserOnboardingTour|Close 'Learn GitLab'" -msgstr "" - -msgid "UserOnboardingTour|Commits are shown in chronological order and can be filtered by the commit message or by the branch." -msgstr "" - -msgid "UserOnboardingTour|Create a project" -msgstr "" - -msgid "UserOnboardingTour|Exit 'Learn GitLab'" -msgstr "" - -msgid "UserOnboardingTour|Got it" -msgstr "" - -msgid "UserOnboardingTour|Great job! %{clapHands} We hope the tour was helpful and that you learned how to use GitLab.%{lineBreak}%{lineBreak}We'd love to get your feedback on this tour.%{lineBreak}%{lineBreak}%{emphasisStart}How helpful would you say this guided tour was?%{emphasisEnd}%{lineBreak}%{lineBreak}" -msgstr "" - -msgid "UserOnboardingTour|Guided GitLab Tour" -msgstr "" - -msgid "UserOnboardingTour|Here you can compare the changes of this branch to another one. Changes are divided by files so that it's easier to see what was changed where." -msgstr "" - -msgid "UserOnboardingTour|Here you can create a project from scratch, start with a template or import a repository from other platforms. Whatever you choose, we'll guide you through the process.%{lineBreak}%{lineBreak}Fill in your new project information and click on %{emphasisStart}Create Project%{emphasisEnd} to progress to the next step." -msgstr "" - -msgid "UserOnboardingTour|Here you can see the breakdown of the pipelines: its stages and jobs in each of the stages and their status.%{lineBreak}%{lineBreak}Our CI/CD pipelines are quite complex, most of our users have fewer and simpler pipelines." -msgstr "" - -msgid "UserOnboardingTour|Here you can see the current members of the project (just you at the moment) and invite new members.%{lineBreak}%{lineBreak}You can invite multiple members at once (existing GitLab users or invite by email) and you can also set their roles and permissions.%{lineBreak}%{lineBreak}Add a few members and click on %{emphasisStart}Add to project%{emphasisEnd} to complete this step." -msgstr "" - -msgid "UserOnboardingTour|Here you can see what changes were made with this commit, on what branch and if there's a related merge request. The status of the pipeline will also show up if CI/CD is set up.%{lineBreak}%{lineBreak}You can also comment on the lines of code that were changed and start a discussion with your colleagues!" -msgstr "" - -msgid "UserOnboardingTour|Here's an overview of branches in the %{emphasisStart}%{projectName}%{emphasisEnd} project. They're split into Active and Stale.%{lineBreak}%{lineBreak}From here, you can create a new merge request from a branch, or compare the branch to any other branch in the project. By default, it will compare it to the master branch." -msgstr "" - -msgid "UserOnboardingTour|Invite colleagues" -msgstr "" - -msgid "UserOnboardingTour|Issues are great for communicating and keeping track of progress in GitLab. These are all issues that are open in the %{emphasisStart}%{projectName}%{emphasisEnd}.%{lineBreak}%{lineBreak}You can help us improve GitLab by contributing work to issues that are labeled Accepting merge requests.%{lineBreak}%{lineBreak}This list can be filtered by labels, milestones, assignees, authors... We'll show you how it looks when the list is filtered by a label." -msgstr "" - -msgid "UserOnboardingTour|Learn GitLab" -msgstr "" - -msgid "UserOnboardingTour|Let's take a closer look at a merge request. Click on the title of one." -msgstr "" - -msgid "UserOnboardingTour|Let's take a closer look at all the commits. Click on %{emphasisStart}Commits%{emphasisEnd}." -msgstr "" - -msgid "UserOnboardingTour|Let's take a closer look at the repository of this project. Click on %{emphasisStart}Repository%{emphasisEnd}." -msgstr "" - -msgid "UserOnboardingTour|No thanks" -msgstr "" - -msgid "UserOnboardingTour|Ok, let's go" -msgstr "" - -msgid "UserOnboardingTour|Ok, show me" -msgstr "" - -msgid "UserOnboardingTour|Open one of the issues by clicking on its title." -msgstr "" - -msgid "UserOnboardingTour|Restart this step" -msgstr "" - -msgid "UserOnboardingTour|Skip this step" -msgstr "" - -msgid "UserOnboardingTour|Sweet! Your project was created and is ready to be used.%{lineBreak}%{lineBreak}You can start adding files to the repository or clone it. One last thing we want to show you is how to invite your colleagues to your new project." -msgstr "" - -msgid "UserOnboardingTour|Take a look. Here's a nifty menu for quickly creating issues, merge requests, snippets, projects and groups. Click on it and select \"New project\" from the \"GitLab\" section to get started." -msgstr "" - -msgid "UserOnboardingTour|Thanks for taking the guided tour. Remember, if you want to go through it again, you can start %{emphasisStart}Learn GitLab%{emphasisEnd} in the help menu on the top right." -msgstr "" - -msgid "UserOnboardingTour|Thanks for the feedback! %{thumbsUp}" -msgstr "" - -msgid "UserOnboardingTour|That's it for issues. Let'st take a look at %{emphasisStart}Merge Requests%{emphasisEnd}." -msgstr "" - -msgid "UserOnboardingTour|That's it for merge requests. Now for the final part of this guided tour - the %{emphasisStart}CI/CD%{emphasisEnd}." -msgstr "" - -msgid "UserOnboardingTour|That's it for the Repository. Let's take a look at the %{emphasisStart}Issues%{emphasisEnd}." -msgstr "" - -msgid "UserOnboardingTour|The structure of this page is very similar to issues. Status, description, discussion and the sidebar are all here.%{lineBreak}%{lineBreak}But take a look below the description and you'll notice that there's more information about the merge request, the CI/CD pipeline and the options for approving it.%{lineBreak}%{lineBreak}Alongside the discussion you can also see more information about commits in this merge request, the status of pipelines and review all changes that were made." -msgstr "" - -msgid "UserOnboardingTour|There's a lot of information here but don't worry, we'll go through it.%{lineBreak}%{lineBreak}On the top you can see the status of the issue and when it was opened and by whom. Directly below it is the issue description and below that are other %{emphasisStart}related issues%{emphasisEnd} and %{emphasisStart}merge requests%{emphasisEnd} (if any). Then below that is the %{emphasisStart}discussion%{emphasisEnd}, that's where most of the communication happens.%{lineBreak}%{lineBreak}On the right, there's a sidebar where you can view/change the %{emphasisStart}assignee, milestone, due date, labels, weight%{emphasisEnd}, etc." -msgstr "" - -msgid "UserOnboardingTour|These are all the CI/CD pipelines we have for our %{emphasisStart}%{projectName}%{emphasisEnd} project.%{lineBreak}%{lineBreak}Here you can see the status of each pipeline, for what commit it's running for, its stages and the status for them." -msgstr "" - -msgid "UserOnboardingTour|These are all the issues that are available for community contributions. Let's take a closer look at one of them." -msgstr "" - -msgid "UserOnboardingTour|This is an overview of all merge requests in this project. Similarly to the issues overview it can be filtered down by things like labels, milestones, authors, assignees, etc." -msgstr "" - -msgid "UserOnboardingTour|This is the repository for the %{emphasisStart}%{projectName}%{emphasisEnd} project. All our code is stored here. Feel free to explore and take a closer look at folders and files.%{lineBreak}%{lineBreak}Above the file structure you can see the latest commit, who the author is and the status of the CI/CD pipeline.%{lineBreak}%{lineBreak}If you scroll down below the file structure, you'll find the Readme of this project. This is defined in the README.md file at the root of the repository." -msgstr "" - -msgid "UserOnboardingTour|Welcome to the project overview of the %{emphasisStart}%{projectName}%{emphasisEnd} project. This is the project that we use to work on GitLab. At first, a project seems like a simple repository, but at GitLab, a project is so much more.%{lineBreak}%{lineBreak}You can create projects for hosting your codebase, use it as an issue tracker, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD." -msgstr "" - msgid "UserProfile|Activity" msgstr "" @@ -25323,9 +25152,6 @@ msgstr "" msgid "Versions" msgstr "" -msgid "Very helpful" -msgstr "" - msgid "View Documentation" msgstr "" @@ -25693,9 +25519,6 @@ msgstr "" msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating." msgstr "" -msgid "We created a short guided tour that will help you learn the basics of GitLab and how it will help you be better at your job. It should only take a couple of minutes. You will be guided by two types of helpers, best recognized by their color." -msgstr "" - msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed." msgstr "" @@ -25792,9 +25615,6 @@ msgstr "" msgid "Welcome to GitLab.com
@%{name}!" msgstr "" -msgid "Welcome to the Guided GitLab Tour" -msgstr "" - msgid "Welcome to the guided GitLab tour" msgstr "" @@ -25842,9 +25662,6 @@ msgstr "" msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly." msgstr "" -msgid "White helpers give contextual information." -msgstr "" - msgid "Who can be an approver?" msgstr "" diff --git a/package.json b/package.json index d6d3af784fe..2adfa838ca6 100644 --- a/package.json +++ b/package.json @@ -40,8 +40,8 @@ "@babel/plugin-syntax-import-meta": "^7.10.1", "@babel/preset-env": "^7.10.1", "@gitlab/at.js": "1.5.5", - "@gitlab/svgs": "1.144.0", - "@gitlab/ui": "17.9.0", + "@gitlab/svgs": "1.146.0", + "@gitlab/ui": "17.10.1", "@gitlab/visual-review-tools": "1.6.1", "@rails/actioncable": "^6.0.3-1", "@sentry/browser": "^5.10.2", diff --git a/qa/qa/page/main/login.rb b/qa/qa/page/main/login.rb index 810abf424a1..8eb28eb53e7 100644 --- a/qa/qa/page/main/login.rb +++ b/qa/qa/page/main/login.rb @@ -165,8 +165,6 @@ module QA terms.accept_terms if terms.visible? end - skip_onboarding if respond_to?(:skip_onboarding) - Page::Main::Menu.validate_elements_present! unless skip_page_validation end @@ -181,5 +179,3 @@ module QA end end end - -QA::Page::Main::Login.prepend_if_ee('QA::EE::Page::Main::Login') diff --git a/qa/qa/specs/features/browser_ui/2_plan/issue/jira_issue_import_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/issue/jira_issue_import_spec.rb index ba8e8635c87..af09899100a 100644 --- a/qa/qa/specs/features/browser_ui/2_plan/issue/jira_issue_import_spec.rb +++ b/qa/qa/specs/features/browser_ui/2_plan/issue/jira_issue_import_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module QA - context 'Plan' do + context 'Plan', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/225409', type: :bug } do describe 'Jira issue import', :jira, :orchestrated, :requires_admin do let(:jira_project_key) { "JITD" } let(:jira_issue_title) { "[#{jira_project_key}-1] Jira to GitLab Test Issue" } diff --git a/spec/frontend/blob/components/mock_data.js b/spec/frontend/blob/components/mock_data.js index 0f7193846ff..58aa1dc6dc9 100644 --- a/spec/frontend/blob/components/mock_data.js +++ b/spec/frontend/blob/components/mock_data.js @@ -32,6 +32,20 @@ export const Blob = { }, }; +export const BinaryBlob = { + binary: true, + name: 'dummy.png', + path: 'foo/bar/dummy.png', + rawPath: '/flightjs/flight/snippets/51/raw', + size: 75, + simpleViewer: { + ...SimpleViewerMock, + }, + richViewer: { + ...RichViewerMock, + }, +}; + export const RichBlobContentMock = { richData: '

Rich

', }; diff --git a/spec/frontend/snippets/components/show_spec.js b/spec/frontend/snippets/components/show_spec.js index 33608df8cf2..b5446e70028 100644 --- a/spec/frontend/snippets/components/show_spec.js +++ b/spec/frontend/snippets/components/show_spec.js @@ -1,10 +1,13 @@ import SnippetApp from '~/snippets/components/show.vue'; +import BlobEmbeddable from '~/blob/components/blob_embeddable.vue'; import SnippetHeader from '~/snippets/components/snippet_header.vue'; import SnippetTitle from '~/snippets/components/snippet_title.vue'; import SnippetBlob from '~/snippets/components/snippet_blob_view.vue'; import { GlLoadingIcon } from '@gitlab/ui'; +import { Blob, BinaryBlob } from 'jest/blob/components/mock_data'; import { shallowMount } from '@vue/test-utils'; +import { SNIPPET_VISIBILITY_PUBLIC } from '~/snippets/constants'; describe('Snippet view app', () => { let wrapper; @@ -12,7 +15,7 @@ describe('Snippet view app', () => { snippetGid: 'gid://gitlab/PersonalSnippet/42', }; - function createComponent({ props = defaultProps, loading = false } = {}) { + function createComponent({ props = defaultProps, data = {}, loading = false } = {}) { const $apollo = { queries: { snippet: { @@ -26,6 +29,9 @@ describe('Snippet view app', () => { propsData: { ...props, }, + data() { + return data; + }, }); } afterEach(() => { @@ -37,10 +43,33 @@ describe('Snippet view app', () => { expect(wrapper.find(GlLoadingIcon).exists()).toBe(true); }); - it('renders all components after the query is finished', () => { + it('renders all simple components after the query is finished', () => { createComponent(); expect(wrapper.find(SnippetHeader).exists()).toBe(true); expect(wrapper.find(SnippetTitle).exists()).toBe(true); - expect(wrapper.find(SnippetBlob).exists()).toBe(true); + }); + + it('renders embeddable component if visibility allows', () => { + createComponent({ + data: { + snippet: { + visibilityLevel: SNIPPET_VISIBILITY_PUBLIC, + webUrl: 'http://foo.bar', + }, + }, + }); + expect(wrapper.contains(BlobEmbeddable)).toBe(true); + }); + + it('renders correct snippet-blob components', () => { + createComponent({ + data: { + blobs: [Blob, BinaryBlob], + }, + }); + const blobs = wrapper.findAll(SnippetBlob); + expect(blobs.length).toBe(2); + expect(blobs.at(0).props('blob')).toEqual(Blob); + expect(blobs.at(1).props('blob')).toEqual(BinaryBlob); }); }); diff --git a/spec/frontend/snippets/components/snippet_blob_view_spec.js b/spec/frontend/snippets/components/snippet_blob_view_spec.js index e4d8ee9b7df..c8f1c8fc8a9 100644 --- a/spec/frontend/snippets/components/snippet_blob_view_spec.js +++ b/spec/frontend/snippets/components/snippet_blob_view_spec.js @@ -23,13 +23,17 @@ describe('Blob Embeddable', () => { id: 'gid://foo.bar/snippet', webUrl: 'https://foo.bar', visibilityLevel: SNIPPET_VISIBILITY_PUBLIC, - blob: BlobMock, }; const dataMock = { activeViewerType: SimpleViewerMock.type, }; - function createComponent(props = {}, data = dataMock, contentLoading = false) { + function createComponent({ + snippetProps = {}, + data = dataMock, + blob = BlobMock, + contentLoading = false, + } = {}) { const $apollo = { queries: { blobContent: { @@ -44,8 +48,9 @@ describe('Blob Embeddable', () => { propsData: { snippet: { ...snippet, - ...props, + ...snippetProps, }, + blob, }, data() { return { @@ -63,7 +68,6 @@ describe('Blob Embeddable', () => { describe('rendering', () => { it('renders correct components', () => { createComponent(); - expect(wrapper.find(BlobEmbeddable).exists()).toBe(true); expect(wrapper.find(BlobHeader).exists()).toBe(true); expect(wrapper.find(BlobContent).exists()).toBe(true); }); @@ -72,19 +76,14 @@ describe('Blob Embeddable', () => { 'does not render blob-embeddable by default', visibilityLevel => { createComponent({ - visibilityLevel, + snippetProps: { + visibilityLevel, + }, }); expect(wrapper.find(BlobEmbeddable).exists()).toBe(false); }, ); - it('does render blob-embeddable for public snippet', () => { - createComponent({ - visibilityLevel: SNIPPET_VISIBILITY_PUBLIC, - }); - expect(wrapper.find(BlobEmbeddable).exists()).toBe(true); - }); - it('sets simple viewer correctly', () => { createComponent(); expect(wrapper.find(SimpleViewer).exists()).toBe(true); @@ -92,7 +91,9 @@ describe('Blob Embeddable', () => { it('sets rich viewer correctly', () => { const data = { ...dataMock, activeViewerType: RichViewerMock.type }; - createComponent({}, data); + createComponent({ + data, + }); expect(wrapper.find(RichViewer).exists()).toBe(true); }); @@ -137,7 +138,9 @@ describe('Blob Embeddable', () => { }); it('renders simple viewer by default if URL contains hash', () => { - createComponent({}, {}); + createComponent({ + data: {}, + }); expect(wrapper.vm.activeViewerType).toBe(SimpleViewerMock.type); expect(wrapper.find(SimpleViewer).exists()).toBe(true); @@ -183,12 +186,11 @@ describe('Blob Embeddable', () => { }); it(`sets '${SimpleViewerMock.type}' as active on ${BLOB_RENDER_EVENT_SHOW_SOURCE} event`, () => { - createComponent( - {}, - { + createComponent({ + data: { activeViewerType: RichViewerMock.type, }, - ); + }); findContentEl().vm.$emit(BLOB_RENDER_EVENT_SHOW_SOURCE); expect(wrapper.vm.activeViewerType).toEqual(SimpleViewerMock.type); diff --git a/spec/frontend/snippets/components/snippet_header_spec.js b/spec/frontend/snippets/components/snippet_header_spec.js index 5230910b6f5..0825da92118 100644 --- a/spec/frontend/snippets/components/snippet_header_spec.js +++ b/spec/frontend/snippets/components/snippet_header_spec.js @@ -3,6 +3,7 @@ import DeleteSnippetMutation from '~/snippets/mutations/deleteSnippet.mutation.g import { ApolloMutation } from 'vue-apollo'; import { GlButton, GlModal } from '@gitlab/ui'; import { shallowMount } from '@vue/test-utils'; +import { Blob, BinaryBlob } from 'jest/blob/components/mock_data'; describe('Snippet header component', () => { let wrapper; @@ -20,9 +21,7 @@ describe('Snippet header component', () => { author: { name: 'Thor Odinson', }, - blob: { - binary: false, - }, + blobs: [Blob], }; const mutationVariables = { mutation: DeleteSnippetMutation, @@ -49,7 +48,6 @@ describe('Snippet header component', () => { mutationRes = mutationTypes.RESOLVE, snippetProps = {}, } = {}) { - // const defaultProps = Object.assign({}, snippet, snippetProps); const defaultProps = Object.assign(snippet, snippetProps); if (permissions) { Object.assign(defaultProps.userPermissions, { @@ -131,15 +129,18 @@ describe('Snippet header component', () => { expect(wrapper.find(GlModal).exists()).toBe(true); }); - it('renders Edit button as disabled for binary snippets', () => { + it.each` + blobs | isDisabled | condition + ${[Blob]} | ${false} | ${'no binary'} + ${[Blob, BinaryBlob]} | ${true} | ${'several blobs. incl. a binary'} + ${[BinaryBlob]} | ${true} | ${'binary'} + `('renders Edit button when snippet contains $condition file', ({ blobs, isDisabled }) => { createComponent({ snippetProps: { - blob: { - binary: true, - }, + blobs, }, }); - expect(wrapper.find('[href*="edit"]').props('disabled')).toBe(true); + expect(wrapper.find('[href*="edit"]').props('disabled')).toBe(isDisabled); }); describe('Delete mutation', () => { diff --git a/spec/graphql/types/root_storage_statistics_type_spec.rb b/spec/graphql/types/root_storage_statistics_type_spec.rb index 19e6f79ae74..f01c55cbccb 100644 --- a/spec/graphql/types/root_storage_statistics_type_spec.rb +++ b/spec/graphql/types/root_storage_statistics_type_spec.rb @@ -7,7 +7,7 @@ RSpec.describe GitlabSchema.types['RootStorageStatistics'] do it 'has all the required fields' do expect(described_class).to have_graphql_fields(:storage_size, :repository_size, :lfs_objects_size, - :build_artifacts_size, :packages_size, :wiki_size) + :build_artifacts_size, :packages_size, :wiki_size, :snippets_size) end specify { expect(described_class).to require_graphql_authorizations(:read_statistics) } diff --git a/spec/lib/gitlab/gitaly_client/call_spec.rb b/spec/lib/gitlab/gitaly_client/call_spec.rb new file mode 100644 index 00000000000..5c33ac40460 --- /dev/null +++ b/spec/lib/gitlab/gitaly_client/call_spec.rb @@ -0,0 +1,122 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Gitlab::GitalyClient::Call do + describe '#call', :request_store do + let(:client) { Gitlab::GitalyClient } + let(:storage) { 'default' } + let(:remote_storage) { nil } + let(:request) { Gitaly::FindLocalBranchesRequest.new } + let(:rpc) { :find_local_branches } + let(:service) { :ref_service } + let(:timeout) { client.long_timeout } + + subject do + described_class.new(storage, service, rpc, request, remote_storage, timeout).call + end + + before do + allow(client).to receive(:execute) { response } + allow(Gitlab::PerformanceBar).to receive(:enabled_for_request?) { true } + end + + def expect_call_details_to_match(duration_higher_than: 0) + expect(client.list_call_details.size).to eq(1) + expect(client.list_call_details.first) + .to match a_hash_including(feature: "#{service}##{rpc}", + duration: a_value > duration_higher_than, + request: an_instance_of(Hash), + rpc: rpc, + backtrace: an_instance_of(Array)) + end + + context 'when the response is not an enumerator' do + let(:response) do + Gitaly::FindLocalBranchesResponse.new + end + + it 'returns the response' do + expect(subject).to eq(response) + end + + it 'stores timings and call details' do + subject + + expect(client.query_time).to be > 0 + expect_call_details_to_match + end + + context 'when err' do + before do + allow(client).to receive(:execute).and_raise(StandardError) + end + + it 'stores timings and call details' do + expect { subject }.to raise_error(StandardError) + + expect(client.query_time).to be > 0 + expect_call_details_to_match + end + end + end + + context 'when the response is an enumerator' do + let(:response) do + Enumerator.new do |yielder| + yielder << 1 + yielder << 2 + end + end + + it 'returns a consumable enumerator' do + instrumented_response = subject + + expect(instrumented_response).to be_a(Enumerator) + expect(instrumented_response.to_a).to eq([1, 2]) + end + + context 'time measurements' do + let(:response) do + Enumerator.new do |yielder| + sleep 0.1 + yielder << 1 + sleep 0.2 + yielder << 2 + end + end + + it 'records full rpc stream consumption' do + subject.to_a + + expect(client.query_time).to be > 0.3 + expect_call_details_to_match(duration_higher_than: 0.3) + end + + it 'records partial rpc stream consumption' do + subject.first + + expect(client.query_time).to be > 0.1 + expect_call_details_to_match(duration_higher_than: 0.1) + end + + context 'when err' do + let(:response) do + Enumerator.new do |yielder| + sleep 0.2 + yielder << 1 + raise StandardError + end + end + + it 'records partial rpc stream consumption' do + expect { subject.to_a }.to raise_error(StandardError) + + expect(client.query_time).to be > 0.2 + expect_call_details_to_match(duration_higher_than: 0.2) + end + end + end + end + end +end diff --git a/spec/lib/gitlab/gitaly_client/cleanup_service_spec.rb b/spec/lib/gitlab/gitaly_client/cleanup_service_spec.rb index 014e54fb3b1..3381c69ea0d 100644 --- a/spec/lib/gitlab/gitaly_client/cleanup_service_spec.rb +++ b/spec/lib/gitlab/gitaly_client/cleanup_service_spec.rb @@ -22,11 +22,5 @@ RSpec.describe Gitlab::GitalyClient::CleanupService do client.apply_bfg_object_map_stream(StringIO.new) end - - it 'is wrapped as a streaming call' do - expect(Gitlab::GitalyClient).to receive(:streaming_call).with(anything, :cleanup_service, :apply_bfg_object_map_stream, anything, anything) - - client.apply_bfg_object_map_stream(StringIO.new) - end end end diff --git a/spec/lib/gitlab/gitaly_client_spec.rb b/spec/lib/gitlab/gitaly_client_spec.rb index b70dc8fb6b0..16dd2bbee6d 100644 --- a/spec/lib/gitlab/gitaly_client_spec.rb +++ b/spec/lib/gitlab/gitaly_client_spec.rb @@ -521,8 +521,6 @@ RSpec.describe Gitlab::GitalyClient do context 'when the request store is active', :request_store do it 'records call details if a RPC is called' do - expect(described_class).to receive(:measure_timings).and_call_original - gitaly_server.server_version expect(described_class.list_call_details).not_to be_empty diff --git a/yarn.lock b/yarn.lock index 4dbd5b7541c..73204580689 100644 --- a/yarn.lock +++ b/yarn.lock @@ -843,15 +843,15 @@ eslint-plugin-vue "^6.2.1" vue-eslint-parser "^7.0.0" -"@gitlab/svgs@1.144.0": - version "1.144.0" - resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-1.144.0.tgz#ee0ec58516405391cbaef00f5a660da6edf27538" - integrity sha512-ejcsxoyfYwXyG8naOnn7QnY0oxrRNcWRBuH9VHrGL9/FXBJWq2NLXENi+v0TjcWvSsc2fBx/nk5V8Au96g0yEg== +"@gitlab/svgs@1.146.0": + version "1.146.0" + resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-1.146.0.tgz#c74118a3f1ab47ae77211d42597f553f395deb5d" + integrity sha512-2/k9pAZPgHpZ5Ad0fz9i1109sWcShDE4XcjrjzltNNksbi86lqCKbsSe580ujtlG8KShgGMkDkmUa6AHZi64Xw== -"@gitlab/ui@17.9.0": - version "17.9.0" - resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-17.9.0.tgz#fc5dcdb69910aa4aadd0905b718c0dd785ca9df6" - integrity sha512-zbgs73ioxrOLigb9CIJXOkMQ80CUPnarurv/j2Oo2sN9cY5yWK+ci0eogx3j2dKQKF0HnTBAVgliTR6T3BHBcQ== +"@gitlab/ui@17.10.1": + version "17.10.1" + resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-17.10.1.tgz#b78f39e4f1ee72ac6c8cdf6824f2703e6dd9fc6d" + integrity sha512-k7jsB+Qc0WlS3Hy8F5456TV2uuOwOR07Qn6PlSI8AB2q3XgT9x95mAV6G6bZ4f2WDNYDrEWPkj+5ySds/IQjfQ== dependencies: "@babel/standalone" "^7.0.0" "@gitlab/vue-toasted" "^1.3.0"