From c4c98e8e0d3696574978b09ab62fec770c480ee7 Mon Sep 17 00:00:00 2001 From: Anna Vovchenko <avovchenko@gitlab.com> Date: Sat, 17 Feb 2024 02:05:39 +0000 Subject: [PATCH] Remove the Kubernetes overview section from the Environments page The section is moved to the Environment details page. Remove it from the index and folder pages. Update the docs. Changelog: changed --- .../components/kubernetes_overview.vue | 138 -------------- .../components/new_environment_item.vue | 42 +---- .../kubernetes}/kubernetes_agent_info.vue | 0 .../{ => kubernetes}/kubernetes_overview.vue | 6 +- .../kubernetes}/kubernetes_pods.vue | 2 +- .../kubernetes}/kubernetes_services.vue | 4 +- .../kubernetes}/kubernetes_status_bar.vue | 6 +- .../kubernetes}/kubernetes_tabs.vue | 0 .../environment_details/index.vue | 2 +- .../folder/environments_folder_bundle.js | 3 - app/assets/javascripts/environments/index.js | 3 - .../projects/environments_controller.rb | 4 +- app/helpers/environments_helper.rb | 3 +- .../projects/environments/index.html.haml | 3 +- .../img/kubernetes_summary_ui.png | Bin 13822 -> 0 bytes .../img/kubernetes_summary_ui_v16_10.png | Bin 0 -> 52131 bytes doc/ci/environments/kubernetes_dashboard.md | 7 +- locale/gitlab.pot | 3 - .../kubernetes}/kubernetes_agent_info_spec.js | 4 +- .../kubernetes_overview_spec.js | 21 +-- .../kubernetes}/kubernetes_pods_spec.js | 8 +- .../kubernetes}/kubernetes_services_spec.js | 8 +- .../kubernetes}/kubernetes_status_bar_spec.js | 6 +- .../kubernetes}/kubernetes_tabs_spec.js | 10 +- .../environment_details/index_spec.js | 2 +- .../environments/kubernetes_overview_spec.js | 172 ------------------ .../environments/new_environment_item_spec.js | 96 +--------- 27 files changed, 52 insertions(+), 501 deletions(-) delete mode 100644 app/assets/javascripts/environments/components/kubernetes_overview.vue rename app/assets/javascripts/environments/{components => environment_details/components/kubernetes}/kubernetes_agent_info.vue (100%) rename app/assets/javascripts/environments/environment_details/components/{ => kubernetes}/kubernetes_overview.vue (94%) rename app/assets/javascripts/environments/{components => environment_details/components/kubernetes}/kubernetes_pods.vue (97%) rename app/assets/javascripts/environments/{components => environment_details/components/kubernetes}/kubernetes_services.vue (93%) rename app/assets/javascripts/environments/{components => environment_details/components/kubernetes}/kubernetes_status_bar.vue (95%) rename app/assets/javascripts/environments/{components => environment_details/components/kubernetes}/kubernetes_tabs.vue (100%) delete mode 100644 doc/ci/environments/img/kubernetes_summary_ui.png create mode 100644 doc/ci/environments/img/kubernetes_summary_ui_v16_10.png rename spec/frontend/environments/{ => environment_details/components/kubernetes}/kubernetes_agent_info_spec.js (92%) rename spec/frontend/environments/environment_details/components/{ => kubernetes}/kubernetes_overview_spec.js (89%) rename spec/frontend/environments/{ => environment_details/components/kubernetes}/kubernetes_pods_spec.js (93%) rename spec/frontend/environments/{ => environment_details/components/kubernetes}/kubernetes_services_spec.js (91%) rename spec/frontend/environments/{ => environment_details/components/kubernetes}/kubernetes_status_bar_spec.js (97%) rename spec/frontend/environments/{ => environment_details/components/kubernetes}/kubernetes_tabs_spec.js (83%) delete mode 100644 spec/frontend/environments/kubernetes_overview_spec.js diff --git a/app/assets/javascripts/environments/components/kubernetes_overview.vue b/app/assets/javascripts/environments/components/kubernetes_overview.vue deleted file mode 100644 index d75606a4f0c75..0000000000000 --- a/app/assets/javascripts/environments/components/kubernetes_overview.vue +++ /dev/null @@ -1,138 +0,0 @@ -<script> -import { GlCollapse, GlButton, GlAlert } from '@gitlab/ui'; -import { __, s__ } from '~/locale'; -import csrf from '~/lib/utils/csrf'; -import { getIdFromGraphQLId } from '~/graphql_shared/utils'; -import KubernetesAgentInfo from './kubernetes_agent_info.vue'; -import KubernetesTabs from './kubernetes_tabs.vue'; -import KubernetesStatusBar from './kubernetes_status_bar.vue'; - -export default { - components: { - GlCollapse, - GlButton, - GlAlert, - KubernetesAgentInfo, - KubernetesTabs, - KubernetesStatusBar, - }, - inject: ['kasTunnelUrl'], - props: { - clusterAgent: { - required: true, - type: Object, - }, - environmentName: { - required: true, - type: String, - }, - namespace: { - required: false, - type: String, - default: '', - }, - fluxResourcePath: { - required: false, - type: String, - default: '', - }, - }, - data() { - return { - isVisible: false, - error: '', - failedState: {}, - podsLoading: false, - }; - }, - computed: { - chevronIcon() { - return this.isVisible ? 'chevron-down' : 'chevron-right'; - }, - label() { - return this.isVisible ? this.$options.i18n.collapse : this.$options.i18n.expand; - }, - gitlabAgentId() { - return getIdFromGraphQLId(this.clusterAgent.id).toString(); - }, - k8sAccessConfiguration() { - return { - basePath: this.kasTunnelUrl, - headers: { - 'GitLab-Agent-Id': this.gitlabAgentId, - 'Content-Type': 'application/json', - Accept: 'application/json', - ...csrf.headers, - }, - credentials: 'include', - }; - }, - clusterHealthStatus() { - if (this.podsLoading) { - return ''; - } - - return this.hasFailedState ? 'error' : 'success'; - }, - hasFailedState() { - return Object.values(this.failedState).some((item) => item); - }, - }, - methods: { - toggleCollapse() { - this.isVisible = !this.isVisible; - }, - onClusterError(message) { - this.error = message; - }, - onUpdateFailedState(event) { - this.failedState = { - ...this.failedState, - ...event, - }; - }, - }, - i18n: { - collapse: __('Collapse'), - expand: __('Expand'), - sectionTitle: s__('Environment|Kubernetes overview'), - }, -}; -</script> -<template> - <div class="gl-px-4"> - <p class="gl-font-weight-bold gl-text-gray-500 gl-display-flex gl-mb-0"> - <gl-button - :icon="chevronIcon" - :aria-label="label" - category="tertiary" - size="small" - class="gl-mr-3" - @click="toggleCollapse" - />{{ $options.i18n.sectionTitle }} - </p> - <gl-collapse :visible="isVisible" class="gl-md-pl-7 gl-md-pr-5 gl-mt-4"> - <template v-if="isVisible"> - <kubernetes-status-bar - :cluster-health-status="clusterHealthStatus" - :configuration="k8sAccessConfiguration" - :environment-name="environmentName" - :flux-resource-path="fluxResourcePath" - class="gl-mb-3" /> - <kubernetes-agent-info :cluster-agent="clusterAgent" class="gl-mb-5" /> - - <gl-alert v-if="error" variant="danger" :dismissible="false" class="gl-mb-5"> - {{ error }} - </gl-alert> - - <kubernetes-tabs - :configuration="k8sAccessConfiguration" - :namespace="namespace" - class="gl-mb-5" - @cluster-error="onClusterError" - @loading="podsLoading = $event" - @update-failed-state="onUpdateFailedState" - /></template> - </gl-collapse> - </div> -</template> diff --git a/app/assets/javascripts/environments/components/new_environment_item.vue b/app/assets/javascripts/environments/components/new_environment_item.vue index 8bd55e697fa39..2c2a9ce4493dd 100644 --- a/app/assets/javascripts/environments/components/new_environment_item.vue +++ b/app/assets/javascripts/environments/components/new_environment_item.vue @@ -13,7 +13,6 @@ import { truncate } from '~/lib/utils/text_utility'; import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue'; import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import isLastDeployment from '../graphql/queries/is_last_deployment.query.graphql'; -import getEnvironmentClusterAgent from '../graphql/queries/environment_cluster_agent.query.graphql'; import ExternalUrl from './environment_external_url.vue'; import Actions from './environment_actions.vue'; import StopComponent from './environment_stop.vue'; @@ -23,7 +22,6 @@ import Terminal from './environment_terminal_button.vue'; import Delete from './environment_delete.vue'; import Deployment from './deployment.vue'; import DeployBoardWrapper from './deploy_board_wrapper.vue'; -import KubernetesOverview from './kubernetes_overview.vue'; export default { components: { @@ -43,7 +41,6 @@ export default { Terminal, TimeAgoTooltip, Delete, - KubernetesOverview, EnvironmentAlert: () => import('ee_component/environments/components/environment_alert.vue'), EnvironmentApproval: () => import('ee_component/environments/components/environment_approval.vue'), @@ -82,7 +79,7 @@ export default { tierTooltip: s__('Environment|Deployment tier'), }, data() { - return { visible: false, clusterAgent: null, kubernetesNamespace: '', fluxResourcePath: '' }; + return { visible: false }; }, computed: { icon() { @@ -168,27 +165,6 @@ export default { methods: { toggleEnvironmentCollapse() { this.visible = !this.visible; - - if (this.visible) { - this.getClusterAgent(); - } - }, - getClusterAgent() { - if (this.clusterAgent) return; - - this.$apollo.addSmartQuery('environmentClusterAgent', { - variables() { - return { environmentName: this.environment.name, projectFullPath: this.projectPath }; - }, - query() { - return getEnvironmentClusterAgent; - }, - update(data) { - this.clusterAgent = data?.project?.environment?.clusterAgent; - this.kubernetesNamespace = data?.project?.environment?.kubernetesNamespace || ''; - this.fluxResourcePath = data?.project?.environment?.fluxResourcePath || ''; - }, - }); }, }, deploymentClasses: [ @@ -207,13 +183,6 @@ export default { 'gl-md-pl-7', 'gl-bg-gray-10', ], - kubernetesOverviewClasses: [ - 'gl-border-gray-100', - 'gl-border-t-solid', - 'gl-border-1', - 'gl-py-4', - 'gl-bg-gray-10', - ], }; </script> <template> @@ -366,15 +335,6 @@ export default { </template> </gl-sprintf> </div> - <div v-if="clusterAgent" :class="$options.kubernetesOverviewClasses"> - <kubernetes-overview - :class="{ 'gl-ml-7': inFolder }" - :cluster-agent="clusterAgent" - :namespace="kubernetesNamespace" - :flux-resource-path="fluxResourcePath" - :environment-name="environment.name" - /> - </div> <div v-if="rolloutStatus" :class="$options.deployBoardClasses"> <deploy-board-wrapper :rollout-status="rolloutStatus" diff --git a/app/assets/javascripts/environments/components/kubernetes_agent_info.vue b/app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_agent_info.vue similarity index 100% rename from app/assets/javascripts/environments/components/kubernetes_agent_info.vue rename to app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_agent_info.vue diff --git a/app/assets/javascripts/environments/environment_details/components/kubernetes_overview.vue b/app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_overview.vue similarity index 94% rename from app/assets/javascripts/environments/environment_details/components/kubernetes_overview.vue rename to app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_overview.vue index e7d6d63967967..cd959f7ef0c7e 100644 --- a/app/assets/javascripts/environments/environment_details/components/kubernetes_overview.vue +++ b/app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_overview.vue @@ -7,9 +7,9 @@ import { getIdFromGraphQLId } from '~/graphql_shared/utils'; import { createK8sAccessConfiguration } from '~/environments/helpers/k8s_integration_helper'; import { CLUSTER_HEALTH_SUCCESS, CLUSTER_HEALTH_ERROR } from '~/environments/constants'; import environmentClusterAgentQuery from '~/environments/graphql/queries/environment_cluster_agent.query.graphql'; -import KubernetesStatusBar from '~/environments/components/kubernetes_status_bar.vue'; -import KubernetesAgentInfo from '~/environments/components/kubernetes_agent_info.vue'; -import KubernetesTabs from '~/environments/components/kubernetes_tabs.vue'; +import KubernetesStatusBar from './kubernetes_status_bar.vue'; +import KubernetesAgentInfo from './kubernetes_agent_info.vue'; +import KubernetesTabs from './kubernetes_tabs.vue'; export default { components: { diff --git a/app/assets/javascripts/environments/components/kubernetes_pods.vue b/app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_pods.vue similarity index 97% rename from app/assets/javascripts/environments/components/kubernetes_pods.vue rename to app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_pods.vue index 7a77f0138497c..4a75d73823f84 100644 --- a/app/assets/javascripts/environments/components/kubernetes_pods.vue +++ b/app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_pods.vue @@ -11,7 +11,7 @@ import { import { getAge } from '~/kubernetes_dashboard/helpers/k8s_integration_helper'; import WorkloadStats from '~/kubernetes_dashboard/components/workload_stats.vue'; import WorkloadTable from '~/kubernetes_dashboard/components/workload_table.vue'; -import k8sPodsQuery from '../graphql/queries/k8s_pods.query.graphql'; +import k8sPodsQuery from '~/environments/graphql/queries/k8s_pods.query.graphql'; export default { components: { diff --git a/app/assets/javascripts/environments/components/kubernetes_services.vue b/app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_services.vue similarity index 93% rename from app/assets/javascripts/environments/components/kubernetes_services.vue rename to app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_services.vue index dc2962a9df597..7cc14ae50ec02 100644 --- a/app/assets/javascripts/environments/components/kubernetes_services.vue +++ b/app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_services.vue @@ -7,8 +7,8 @@ import { } from '~/kubernetes_dashboard/helpers/k8s_integration_helper'; import WorkloadTable from '~/kubernetes_dashboard/components/workload_table.vue'; import { SERVICES_TABLE_FIELDS } from '~/kubernetes_dashboard/constants'; -import k8sServicesQuery from '../graphql/queries/k8s_services.query.graphql'; -import { SERVICES_LIMIT_PER_PAGE } from '../constants'; +import k8sServicesQuery from '~/environments/graphql/queries/k8s_services.query.graphql'; +import { SERVICES_LIMIT_PER_PAGE } from '~/environments/constants'; export default { components: { diff --git a/app/assets/javascripts/environments/components/kubernetes_status_bar.vue b/app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_status_bar.vue similarity index 95% rename from app/assets/javascripts/environments/components/kubernetes_status_bar.vue rename to app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_status_bar.vue index 2cf37ccca279f..19070a9c4e0da 100644 --- a/app/assets/javascripts/environments/components/kubernetes_status_bar.vue +++ b/app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_status_bar.vue @@ -12,9 +12,9 @@ import { REASON_PROGRESSING, HELM_RELEASES_RESOURCE_TYPE, KUSTOMIZATIONS_RESOURCE_TYPE, -} from '../constants'; -import fluxKustomizationStatusQuery from '../graphql/queries/flux_kustomization_status.query.graphql'; -import fluxHelmReleaseStatusQuery from '../graphql/queries/flux_helm_release_status.query.graphql'; +} from '~/environments/constants'; +import fluxKustomizationStatusQuery from '~/environments/graphql/queries/flux_kustomization_status.query.graphql'; +import fluxHelmReleaseStatusQuery from '~/environments/graphql/queries/flux_helm_release_status.query.graphql'; export default { components: { diff --git a/app/assets/javascripts/environments/components/kubernetes_tabs.vue b/app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_tabs.vue similarity index 100% rename from app/assets/javascripts/environments/components/kubernetes_tabs.vue rename to app/assets/javascripts/environments/environment_details/components/kubernetes/kubernetes_tabs.vue diff --git a/app/assets/javascripts/environments/environment_details/index.vue b/app/assets/javascripts/environments/environment_details/index.vue index 690942349d66a..fadf40e638631 100644 --- a/app/assets/javascripts/environments/environment_details/index.vue +++ b/app/assets/javascripts/environments/environment_details/index.vue @@ -3,7 +3,7 @@ import { GlTabs, GlTab } from '@gitlab/ui'; import { s__ } from '~/locale'; import DeploymentHistory from './components/deployment_history.vue'; -import KubernetesOverview from './components/kubernetes_overview.vue'; +import KubernetesOverview from './components/kubernetes/kubernetes_overview.vue'; export default { components: { diff --git a/app/assets/javascripts/environments/folder/environments_folder_bundle.js b/app/assets/javascripts/environments/folder/environments_folder_bundle.js index 05a2eba6af30a..d6dc1a3e2c4ea 100644 --- a/app/assets/javascripts/environments/folder/environments_folder_bundle.js +++ b/app/assets/javascripts/environments/folder/environments_folder_bundle.js @@ -3,7 +3,6 @@ import VueApollo from 'vue-apollo'; import VueRouter from 'vue-router'; import createDefaultClient from '~/lib/graphql'; import Translate from '~/vue_shared/translate'; -import { removeLastSlashInUrlPath } from '~/lib/utils/url_utility'; import { apolloProvider } from '../graphql/client'; import EnvironmentsFolderView from './environments_folder_view.vue'; import EnvironmentsFolderApp from './environments_folder_app.vue'; @@ -22,7 +21,6 @@ export default () => { Vue.use(VueRouter); const folderPath = environmentsData.endpoint.replace('.json', ''); - const kasTunnelUrl = removeLastSlashInUrlPath(environmentsData.kasTunnelUrl); const { projectPath, folderName, helpPagePath } = environmentsData; const router = new VueRouter({ @@ -54,7 +52,6 @@ export default () => { provide: { projectPath, helpPagePath, - kasTunnelUrl, }, apolloProvider, router, diff --git a/app/assets/javascripts/environments/index.js b/app/assets/javascripts/environments/index.js index 0e0ea018618ae..04a3c46f03496 100644 --- a/app/assets/javascripts/environments/index.js +++ b/app/assets/javascripts/environments/index.js @@ -1,7 +1,6 @@ import Vue from 'vue'; import VueApollo from 'vue-apollo'; import { GlToast } from '@gitlab/ui'; -import { removeLastSlashInUrlPath } from '~/lib/utils/url_utility'; import { parseBoolean } from '../lib/utils/common_utils'; import { apolloProvider } from './graphql/client'; import EnvironmentsApp from './components/environments_app.vue'; @@ -19,7 +18,6 @@ export default (el) => { projectPath, defaultBranchName, projectId, - kasTunnelUrl, } = el.dataset; return new Vue({ @@ -32,7 +30,6 @@ export default (el) => { newEnvironmentPath, helpPagePath, projectId, - kasTunnelUrl: removeLastSlashInUrlPath(kasTunnelUrl), canCreateEnvironment: parseBoolean(canCreateEnvironment), }, render(h) { diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb index 862aac2dd29c5..ee6091b38d1fb 100644 --- a/app/controllers/projects/environments_controller.rb +++ b/app/controllers/projects/environments_controller.rb @@ -10,7 +10,7 @@ class Projects::EnvironmentsController < Projects::ApplicationController layout 'project' - before_action only: [:index, :show] do + before_action only: [:show] do push_frontend_feature_flag(:k8s_watch_api, project) end @@ -26,7 +26,7 @@ class Projects::EnvironmentsController < Projects::ApplicationController before_action :environment, only: [:show, :edit, :update, :stop, :terminal, :terminal_websocket_authorize, :cancel_auto_stop] before_action :verify_api_request!, only: :terminal_websocket_authorize before_action :expire_etag_cache, only: [:index], unless: -> { request.format.json? } - before_action :set_kas_cookie, only: [:index, :folder, :edit, :new, :show], if: -> { current_user && request.format.html? } + before_action :set_kas_cookie, only: [:edit, :new, :show], if: -> { current_user && request.format.html? } after_action :expire_etag_cache, only: [:cancel_auto_stop] track_event :index, :folder, :show, :new, :edit, :create, :update, :stop, :cancel_auto_stop, :terminal, diff --git a/app/helpers/environments_helper.rb b/app/helpers/environments_helper.rb index ac34f429508d2..66f29e84f665f 100644 --- a/app/helpers/environments_helper.rb +++ b/app/helpers/environments_helper.rb @@ -15,8 +15,7 @@ def environments_folder_list_view_data(project, folder) "folder_name" => folder, "project_path" => project.full_path, "help_page_path" => help_page_path("ci/environments/index"), - "can_read_environment" => can?(current_user, :read_environment, @project).to_s, - "kas_tunnel_url" => ::Gitlab::Kas.tunnel_url + "can_read_environment" => can?(current_user, :read_environment, @project).to_s } end diff --git a/app/views/projects/environments/index.html.haml b/app/views/projects/environments/index.html.haml index c2bea4bf43c60..a55d1078b7b26 100644 --- a/app/views/projects/environments/index.html.haml +++ b/app/views/projects/environments/index.html.haml @@ -8,5 +8,4 @@ "help-page-path" => help_page_path("ci/environments/index"), "project-path" => @project.full_path, "project-id" => @project.id, - "default-branch-name" => @project.default_branch_or_main, - "kas-tunnel-url" => ::Gitlab::Kas.tunnel_url } } + "default-branch-name" => @project.default_branch_or_main } } diff --git a/doc/ci/environments/img/kubernetes_summary_ui.png b/doc/ci/environments/img/kubernetes_summary_ui.png deleted file mode 100644 index f8eae88745e59cb1b99b1e58177b594ea0c07452..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13822 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 diff --git a/doc/ci/environments/img/kubernetes_summary_ui_v16_10.png b/doc/ci/environments/img/kubernetes_summary_ui_v16_10.png new file mode 100644 index 0000000000000000000000000000000000000000..58a6ca1397a0d51772022265ccec7ab8912fab22 GIT binary patch literal 52131 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�P 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�o;=`zj~DHUA|j9yjVW`e@;fY#NZqDE=QSaUJIM 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	Ip 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 R!I};yEiNxsA!-=(zX6mJ@=O2# literal 0 HcmV?d00001 diff --git a/doc/ci/environments/kubernetes_dashboard.md b/doc/ci/environments/kubernetes_dashboard.md index 61f2cea5aefdd..8903508782442 100644 --- a/doc/ci/environments/kubernetes_dashboard.md +++ b/doc/ci/environments/kubernetes_dashboard.md @@ -14,12 +14,13 @@ DETAILS: > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/390769) in GitLab 16.1, with [flags](../../administration/feature_flags.md) named `environment_settings_to_graphql`, `kas_user_access`, `kas_user_access_project`, and `expose_authorized_cluster_agents`. This feature is in [Beta](../../policy/experiment-beta-support.md#beta). > - Feature flag `environment_settings_to_graphql` [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124177) in GitLab 16.2. > - Feature flags `kas_user_access`, `kas_user_access_project`, and `expose_authorized_cluster_agents` [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125835) in GitLab 16.2. +> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/431746) to the environment details page in 16.10. Use the Dashboard for Kubernetes to understand the status of your clusters with an intuitive visual interface. The dashboard works with every connected Kubernetes cluster, whether you deployed them with CI/CD or GitOps. - + ## Configure a dashboard @@ -76,8 +77,8 @@ To view a configured dashboard: 1. On the left sidebar, select **Search or go to** and find your project. 1. Select **Operate > Environments**. -1. Expand the environment associated with the agent for Kubernetes. -1. Expand **Kubernetes overview**. +1. Select the environment associated with the agent for Kubernetes. +1. Select the **Kubernetes overview** tab. ### Flux sync status diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 155ef5e02b0bf..1e7fa4154e3fc 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -19508,9 +19508,6 @@ msgstr "" msgid "Environment|Healthy" msgstr "" -msgid "Environment|Kubernetes overview" -msgstr "" - msgid "Environment|No Kubernetes clusters configured" msgstr "" diff --git a/spec/frontend/environments/kubernetes_agent_info_spec.js b/spec/frontend/environments/environment_details/components/kubernetes/kubernetes_agent_info_spec.js similarity index 92% rename from spec/frontend/environments/kubernetes_agent_info_spec.js rename to spec/frontend/environments/environment_details/components/kubernetes/kubernetes_agent_info_spec.js index 9169b9284f428..d04b02f1bad06 100644 --- a/spec/frontend/environments/kubernetes_agent_info_spec.js +++ b/spec/frontend/environments/environment_details/components/kubernetes/kubernetes_agent_info_spec.js @@ -2,7 +2,7 @@ import { shallowMount } from '@vue/test-utils'; import { GlIcon, GlLink, GlSprintf } from '@gitlab/ui'; import { extendedWrapper } from 'helpers/vue_test_utils_helper'; import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue'; -import KubernetesAgentInfo from '~/environments/components/kubernetes_agent_info.vue'; +import KubernetesAgentInfo from '~/environments/environment_details/components/kubernetes/kubernetes_agent_info.vue'; import { AGENT_STATUSES, ACTIVE_CONNECTION_TIME } from '~/clusters_list/constants'; import waitForPromises from 'helpers/wait_for_promises'; @@ -15,7 +15,7 @@ const defaultClusterAgent = { const connectedTimeNow = new Date(); const connectedTimeInactive = new Date(connectedTimeNow.getTime() - ACTIVE_CONNECTION_TIME); -describe('~/environments/components/kubernetes_agent_info.vue', () => { +describe('~/environments/environment_details/components/kubernetes/kubernetes_agent_info.vue', () => { let wrapper; const findAgentLink = () => wrapper.findComponent(GlLink); diff --git a/spec/frontend/environments/environment_details/components/kubernetes_overview_spec.js b/spec/frontend/environments/environment_details/components/kubernetes/kubernetes_overview_spec.js similarity index 89% rename from spec/frontend/environments/environment_details/components/kubernetes_overview_spec.js rename to spec/frontend/environments/environment_details/components/kubernetes/kubernetes_overview_spec.js index 82a21e3239e88..b440a1794c226 100644 --- a/spec/frontend/environments/environment_details/components/kubernetes_overview_spec.js +++ b/spec/frontend/environments/environment_details/components/kubernetes/kubernetes_overview_spec.js @@ -2,17 +2,17 @@ import Vue, { nextTick } from 'vue'; import VueApollo from 'vue-apollo'; import { GlLoadingIcon, GlEmptyState, GlAlert } from '@gitlab/ui'; import { shallowMount } from '@vue/test-utils'; -import KubernetesOverview from '~/environments/environment_details/components/kubernetes_overview.vue'; -import KubernetesStatusBar from '~/environments/components/kubernetes_status_bar.vue'; -import KubernetesAgentInfo from '~/environments/components/kubernetes_agent_info.vue'; -import KubernetesTabs from '~/environments/components/kubernetes_tabs.vue'; +import KubernetesOverview from '~/environments/environment_details/components/kubernetes/kubernetes_overview.vue'; +import KubernetesStatusBar from '~/environments/environment_details/components/kubernetes/kubernetes_status_bar.vue'; +import KubernetesAgentInfo from '~/environments/environment_details/components/kubernetes/kubernetes_agent_info.vue'; +import KubernetesTabs from '~/environments/environment_details/components/kubernetes/kubernetes_tabs.vue'; import environmentClusterAgentQuery from '~/environments/graphql/queries/environment_cluster_agent.query.graphql'; import createMockApollo from 'helpers/mock_apollo_helper'; import waitForPromises from 'helpers/wait_for_promises'; -import { agent, kubernetesNamespace, fluxResourcePathMock } from '../../graphql/mock_data'; -import { mockKasTunnelUrl } from '../../mock_data'; +import { agent, kubernetesNamespace, fluxResourcePathMock } from '../../../graphql/mock_data'; +import { mockKasTunnelUrl } from '../../../mock_data'; -describe('~/environments/kubernetes_overview/index.vue', () => { +describe('~/environments/environment_details/components/kubernetes/kubernetes_overview.vue', () => { Vue.use(VueApollo); let wrapper; @@ -50,10 +50,9 @@ describe('~/environments/kubernetes_overview/index.vue', () => { }, }, }; - const mockApollo = createMockApollo( - [[environmentClusterAgentQuery, jest.fn().mockResolvedValue(defaultEnvironmentData)]], - [], - ); + const mockApollo = createMockApollo([ + [environmentClusterAgentQuery, jest.fn().mockResolvedValue(defaultEnvironmentData)], + ]); return shallowMount(KubernetesOverview, { apolloProvider: mockApollo, diff --git a/spec/frontend/environments/kubernetes_pods_spec.js b/spec/frontend/environments/environment_details/components/kubernetes/kubernetes_pods_spec.js similarity index 93% rename from spec/frontend/environments/kubernetes_pods_spec.js rename to spec/frontend/environments/environment_details/components/kubernetes/kubernetes_pods_spec.js index df18cd7cbc460..dbbf8e7f5d4c9 100644 --- a/spec/frontend/environments/kubernetes_pods_spec.js +++ b/spec/frontend/environments/environment_details/components/kubernetes/kubernetes_pods_spec.js @@ -4,16 +4,16 @@ import { shallowMount } from '@vue/test-utils'; import { GlLoadingIcon, GlTab } from '@gitlab/ui'; import waitForPromises from 'helpers/wait_for_promises'; import createMockApollo from 'helpers/mock_apollo_helper'; -import KubernetesPods from '~/environments/components/kubernetes_pods.vue'; +import KubernetesPods from '~/environments/environment_details/components/kubernetes/kubernetes_pods.vue'; import WorkloadStats from '~/kubernetes_dashboard/components/workload_stats.vue'; import WorkloadTable from '~/kubernetes_dashboard/components/workload_table.vue'; import { useFakeDate } from 'helpers/fake_date'; -import { mockKasTunnelUrl } from './mock_data'; -import { k8sPodsMock, k8sPodsStatsData, k8sPodsTableData } from './graphql/mock_data'; +import { mockKasTunnelUrl } from '../../../mock_data'; +import { k8sPodsMock, k8sPodsStatsData, k8sPodsTableData } from '../../../graphql/mock_data'; Vue.use(VueApollo); -describe('~/environments/components/kubernetes_pods.vue', () => { +describe('~/environments/environment_details/components/kubernetes/kubernetes_pods.vue', () => { let wrapper; const namespace = 'my-kubernetes-namespace'; diff --git a/spec/frontend/environments/kubernetes_services_spec.js b/spec/frontend/environments/environment_details/components/kubernetes/kubernetes_services_spec.js similarity index 91% rename from spec/frontend/environments/kubernetes_services_spec.js rename to spec/frontend/environments/environment_details/components/kubernetes/kubernetes_services_spec.js index 57207da40639a..9ab97dc4bbec3 100644 --- a/spec/frontend/environments/kubernetes_services_spec.js +++ b/spec/frontend/environments/environment_details/components/kubernetes/kubernetes_services_spec.js @@ -5,16 +5,16 @@ import { GlLoadingIcon, GlTab } from '@gitlab/ui'; import { useFakeDate } from 'helpers/fake_date'; import waitForPromises from 'helpers/wait_for_promises'; import createMockApollo from 'helpers/mock_apollo_helper'; -import KubernetesServices from '~/environments/components/kubernetes_services.vue'; +import KubernetesServices from '~/environments/environment_details/components/kubernetes/kubernetes_services.vue'; import WorkloadTable from '~/kubernetes_dashboard/components/workload_table.vue'; import { SERVICES_LIMIT_PER_PAGE } from '~/environments/constants'; import { SERVICES_TABLE_FIELDS } from '~/kubernetes_dashboard/constants'; -import { mockKasTunnelUrl } from './mock_data'; -import { k8sServicesMock } from './graphql/mock_data'; +import { mockKasTunnelUrl } from '../../../mock_data'; +import { k8sServicesMock } from '../../../graphql/mock_data'; Vue.use(VueApollo); -describe('~/environments/components/kubernetes_services.vue', () => { +describe('~/environments/environment_details/components/kubernetes/kubernetes_services.vue', () => { let wrapper; const namespace = 'my-kubernetes-namespace'; diff --git a/spec/frontend/environments/kubernetes_status_bar_spec.js b/spec/frontend/environments/environment_details/components/kubernetes/kubernetes_status_bar_spec.js similarity index 97% rename from spec/frontend/environments/kubernetes_status_bar_spec.js rename to spec/frontend/environments/environment_details/components/kubernetes/kubernetes_status_bar_spec.js index 21f8f75f0683b..92195ba31f235 100644 --- a/spec/frontend/environments/kubernetes_status_bar_spec.js +++ b/spec/frontend/environments/environment_details/components/kubernetes/kubernetes_status_bar_spec.js @@ -2,7 +2,7 @@ import Vue from 'vue'; import VueApollo from 'vue-apollo'; import { GlLoadingIcon, GlPopover, GlSprintf } from '@gitlab/ui'; import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; -import KubernetesStatusBar from '~/environments/components/kubernetes_status_bar.vue'; +import KubernetesStatusBar from '~/environments/environment_details/components/kubernetes/kubernetes_status_bar.vue'; import { CLUSTER_HEALTH_SUCCESS, CLUSTER_HEALTH_ERROR, @@ -12,7 +12,7 @@ import { } from '~/environments/constants'; import waitForPromises from 'helpers/wait_for_promises'; import createMockApollo from 'helpers/mock_apollo_helper'; -import { mockKasTunnelUrl } from './mock_data'; +import { mockKasTunnelUrl } from '../../../mock_data'; Vue.use(VueApollo); @@ -27,7 +27,7 @@ const environmentName = 'environment_name'; const kustomizationResourcePath = 'kustomize.toolkit.fluxcd.io/v1beta1/namespaces/my-namespace/kustomizations/app'; -describe('~/environments/components/kubernetes_status_bar.vue', () => { +describe('~/environments/environment_details/components/kubernetes/kubernetes_status_bar.vue', () => { let wrapper; const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon); diff --git a/spec/frontend/environments/kubernetes_tabs_spec.js b/spec/frontend/environments/environment_details/components/kubernetes/kubernetes_tabs_spec.js similarity index 83% rename from spec/frontend/environments/kubernetes_tabs_spec.js rename to spec/frontend/environments/environment_details/components/kubernetes/kubernetes_tabs_spec.js index 8bc8fcf9b1ab2..aede932d16495 100644 --- a/spec/frontend/environments/kubernetes_tabs_spec.js +++ b/spec/frontend/environments/environment_details/components/kubernetes/kubernetes_tabs_spec.js @@ -1,11 +1,11 @@ import { shallowMount } from '@vue/test-utils'; import { GlTabs } from '@gitlab/ui'; -import KubernetesTabs from '~/environments/components/kubernetes_tabs.vue'; -import KubernetesPods from '~/environments/components/kubernetes_pods.vue'; -import KubernetesServices from '~/environments/components/kubernetes_services.vue'; -import { mockKasTunnelUrl } from './mock_data'; +import KubernetesTabs from '~/environments/environment_details/components/kubernetes/kubernetes_tabs.vue'; +import KubernetesPods from '~/environments/environment_details/components/kubernetes/kubernetes_pods.vue'; +import KubernetesServices from '~/environments/environment_details/components/kubernetes/kubernetes_services.vue'; +import { mockKasTunnelUrl } from '../../../mock_data'; -describe('~/environments/components/kubernetes_tabs.vue', () => { +describe('~/environments/environment_details/components/kubernetes/kubernetes_tabs.vue', () => { let wrapper; const namespace = 'my-kubernetes-namespace'; diff --git a/spec/frontend/environments/environment_details/index_spec.js b/spec/frontend/environments/environment_details/index_spec.js index b352079ac2e51..0871d45fcec37 100644 --- a/spec/frontend/environments/environment_details/index_spec.js +++ b/spec/frontend/environments/environment_details/index_spec.js @@ -3,7 +3,7 @@ import { shallowMount } from '@vue/test-utils'; import { nextTick } from 'vue'; import EnvironmentsDetailPage from '~/environments/environment_details/index.vue'; import DeploymentsHistory from '~/environments/environment_details/components/deployment_history.vue'; -import KubernetesOverview from '~/environments/environment_details/components/kubernetes_overview.vue'; +import KubernetesOverview from '~/environments/environment_details/components/kubernetes/kubernetes_overview.vue'; const projectFullPath = 'gitlab-group/test-project'; const environmentName = 'test-environment-name'; diff --git a/spec/frontend/environments/kubernetes_overview_spec.js b/spec/frontend/environments/kubernetes_overview_spec.js deleted file mode 100644 index 9e97552681544..0000000000000 --- a/spec/frontend/environments/kubernetes_overview_spec.js +++ /dev/null @@ -1,172 +0,0 @@ -import { nextTick } from 'vue'; -import { shallowMount } from '@vue/test-utils'; -import { GlCollapse, GlButton, GlAlert } from '@gitlab/ui'; -import KubernetesOverview from '~/environments/components/kubernetes_overview.vue'; -import KubernetesAgentInfo from '~/environments/components/kubernetes_agent_info.vue'; -import KubernetesTabs from '~/environments/components/kubernetes_tabs.vue'; -import KubernetesStatusBar from '~/environments/components/kubernetes_status_bar.vue'; -import { - agent, - kubernetesNamespace, - resolvedEnvironment, - fluxResourcePathMock, -} from './graphql/mock_data'; -import { mockKasTunnelUrl } from './mock_data'; - -const propsData = { - clusterAgent: agent, - namespace: kubernetesNamespace, - environmentName: resolvedEnvironment.name, - fluxResourcePath: fluxResourcePathMock, -}; - -const provide = { - kasTunnelUrl: mockKasTunnelUrl, -}; - -const configuration = { - basePath: provide.kasTunnelUrl.replace(/\/$/, ''), - headers: { - 'GitLab-Agent-Id': '1', - 'Content-Type': 'application/json', - Accept: 'application/json', - }, - credentials: 'include', -}; - -describe('~/environments/components/kubernetes_overview.vue', () => { - let wrapper; - - const findCollapse = () => wrapper.findComponent(GlCollapse); - const findCollapseButton = () => wrapper.findComponent(GlButton); - const findAgentInfo = () => wrapper.findComponent(KubernetesAgentInfo); - const findKubernetesTabs = () => wrapper.findComponent(KubernetesTabs); - const findKubernetesStatusBar = () => wrapper.findComponent(KubernetesStatusBar); - const findAlert = () => wrapper.findComponent(GlAlert); - - const createWrapper = () => { - wrapper = shallowMount(KubernetesOverview, { - propsData, - provide, - }); - }; - - const toggleCollapse = async () => { - findCollapseButton().vm.$emit('click'); - await nextTick(); - }; - - describe('default', () => { - beforeEach(() => { - createWrapper(); - }); - - it('renders the kubernetes overview title', () => { - expect(wrapper.text()).toBe(KubernetesOverview.i18n.sectionTitle); - }); - }); - - describe('collapse', () => { - beforeEach(() => { - createWrapper(); - }); - - it('is collapsed by default', () => { - expect(findCollapse().props('visible')).toBe(false); - expect(findCollapseButton().attributes('aria-label')).toBe(KubernetesOverview.i18n.expand); - expect(findCollapseButton().props('icon')).toBe('chevron-right'); - }); - - it("doesn't render components when the collapse is not visible", () => { - expect(findAgentInfo().exists()).toBe(false); - expect(findKubernetesTabs().exists()).toBe(false); - }); - - it('opens on click', async () => { - findCollapseButton().vm.$emit('click'); - await nextTick(); - - expect(findCollapse().props('visible')).toBe(true); - expect(findCollapseButton().attributes('aria-label')).toBe(KubernetesOverview.i18n.collapse); - expect(findCollapseButton().props('icon')).toBe('chevron-down'); - }); - }); - - describe('when section is expanded', () => { - beforeEach(() => { - createWrapper(); - toggleCollapse(); - }); - - it('renders kubernetes agent info', () => { - expect(findAgentInfo().props('clusterAgent')).toEqual(agent); - }); - - it('renders kubernetes tabs', () => { - expect(findKubernetesTabs().props()).toEqual({ - namespace: kubernetesNamespace, - configuration, - }); - }); - - it('renders kubernetes status bar', () => { - expect(findKubernetesStatusBar().props()).toEqual({ - clusterHealthStatus: 'success', - configuration, - environmentName: resolvedEnvironment.name, - fluxResourcePath: fluxResourcePathMock, - }); - }); - }); - - describe('Kubernetes health status', () => { - beforeEach(() => { - createWrapper(); - toggleCollapse(); - }); - - it("doesn't set `clusterHealthStatus` when pods are still loading", async () => { - findKubernetesTabs().vm.$emit('loading', true); - await nextTick(); - - expect(findKubernetesStatusBar().props('clusterHealthStatus')).toBe(''); - }); - - it('sets `clusterHealthStatus` as error when pods emitted a failure', async () => { - findKubernetesTabs().vm.$emit('update-failed-state', { pods: true }); - await nextTick(); - - expect(findKubernetesStatusBar().props('clusterHealthStatus')).toBe('error'); - }); - - it('sets `clusterHealthStatus` as success when data is loaded and no failures where emitted', () => { - expect(findKubernetesStatusBar().props('clusterHealthStatus')).toBe('success'); - }); - - it('sets `clusterHealthStatus` as success after state update if there are no failures', async () => { - findKubernetesTabs().vm.$emit('update-failed-state', { pods: true }); - await nextTick(); - expect(findKubernetesStatusBar().props('clusterHealthStatus')).toBe('error'); - - findKubernetesTabs().vm.$emit('update-failed-state', { pods: false }); - await nextTick(); - expect(findKubernetesStatusBar().props('clusterHealthStatus')).toBe('success'); - }); - }); - - describe('on cluster error', () => { - beforeEach(() => { - createWrapper(); - toggleCollapse(); - }); - - it('shows alert with the error message', async () => { - const error = 'Error message from pods'; - - findKubernetesTabs().vm.$emit('cluster-error', error); - await nextTick(); - - expect(findAlert().text()).toBe(error); - }); - }); -}); diff --git a/spec/frontend/environments/new_environment_item_spec.js b/spec/frontend/environments/new_environment_item_spec.js index 552c44fe1974d..9c88380d61636 100644 --- a/spec/frontend/environments/new_environment_item_spec.js +++ b/spec/frontend/environments/new_environment_item_spec.js @@ -3,7 +3,6 @@ import Vue from 'vue'; import { GlCollapse, GlIcon } from '@gitlab/ui'; import createMockApollo from 'helpers/mock_apollo_helper'; import { mountExtended, extendedWrapper } from 'helpers/vue_test_utils_helper'; -import waitForPromises from 'helpers/wait_for_promises'; import { stubTransition } from 'helpers/stub_transition'; import { getTimeago, localeDateFormat } from '~/lib/utils/datetime_utility'; import { __, s__, sprintf } from '~/locale'; @@ -11,40 +10,15 @@ import EnvironmentItem from '~/environments/components/new_environment_item.vue' import EnvironmentActions from '~/environments/components/environment_actions.vue'; import Deployment from '~/environments/components/deployment.vue'; import DeployBoardWrapper from '~/environments/components/deploy_board_wrapper.vue'; -import KubernetesOverview from '~/environments/components/kubernetes_overview.vue'; -import getEnvironmentClusterAgent from '~/environments/graphql/queries/environment_cluster_agent.query.graphql'; -import { - resolvedEnvironment, - rolloutStatus, - agent, - fluxResourcePathMock, -} from './graphql/mock_data'; -import { mockKasTunnelUrl } from './mock_data'; +import { resolvedEnvironment, rolloutStatus } from './graphql/mock_data'; Vue.use(VueApollo); describe('~/environments/components/new_environment_item.vue', () => { let wrapper; - let queryResponseHandler; - const projectPath = '/1'; - - const createApolloProvider = (clusterAgent = null) => { - const response = { - data: { - project: { - id: '1', - environment: { - id: '1', - kubernetesNamespace: 'default', - fluxResourcePath: fluxResourcePathMock, - clusterAgent, - }, - }, - }, - }; - queryResponseHandler = jest.fn().mockResolvedValue(response); - return createMockApollo([[getEnvironmentClusterAgent, queryResponseHandler]]); + const createApolloProvider = () => { + return createMockApollo(); }; const createWrapper = ({ propsData = {}, provideData = {}, apolloProvider } = {}) => @@ -54,8 +28,7 @@ describe('~/environments/components/new_environment_item.vue', () => { provide: { helpPagePath: '/help', projectId: '1', - projectPath, - kasTunnelUrl: mockKasTunnelUrl, + projectPath: '/1', ...provideData, }, stubs: { transition: stubTransition() }, @@ -63,7 +36,6 @@ describe('~/environments/components/new_environment_item.vue', () => { const findDeployment = () => wrapper.findComponent(Deployment); const findActions = () => wrapper.findComponent(EnvironmentActions); - const findKubernetesOverview = () => wrapper.findComponent(KubernetesOverview); const expandCollapsedSection = async () => { const button = wrapper.findByRole('button', { name: __('Expand') }); @@ -525,64 +497,4 @@ describe('~/environments/components/new_environment_item.vue', () => { expect(deployBoard.exists()).toBe(false); }); }); - - describe('kubernetes overview', () => { - it('should request agent data when the environment is visible', async () => { - wrapper = createWrapper({ - propsData: { environment: resolvedEnvironment }, - apolloProvider: createApolloProvider(agent), - }); - - await expandCollapsedSection(); - - expect(queryResponseHandler).toHaveBeenCalledWith({ - environmentName: resolvedEnvironment.name, - projectFullPath: projectPath, - }); - }); - - it('should render if the environment has an agent associated', async () => { - wrapper = createWrapper({ - propsData: { environment: resolvedEnvironment }, - apolloProvider: createApolloProvider(agent), - }); - - await expandCollapsedSection(); - await waitForPromises(); - - expect(findKubernetesOverview().props()).toMatchObject({ - clusterAgent: agent, - environmentName: resolvedEnvironment.name, - }); - }); - - it('should render with the namespace if the environment has an agent associated', async () => { - wrapper = createWrapper({ - propsData: { environment: resolvedEnvironment }, - apolloProvider: createApolloProvider(agent), - }); - - await expandCollapsedSection(); - await waitForPromises(); - - expect(findKubernetesOverview().props()).toEqual({ - clusterAgent: agent, - environmentName: resolvedEnvironment.name, - namespace: 'default', - fluxResourcePath: fluxResourcePathMock, - }); - }); - - it('should not render if the environment has no agent object', async () => { - wrapper = createWrapper({ - propsData: { environment: resolvedEnvironment }, - apolloProvider: createApolloProvider(), - }); - - await expandCollapsedSection(); - await waitForPromises(); - - expect(findKubernetesOverview().exists()).toBe(false); - }); - }); }); -- GitLab