diff options
5 files changed, 65 insertions, 25 deletions
diff --git a/app/assets/javascripts/clusters/components/application_row.vue b/app/assets/javascripts/clusters/components/application_row.vue index 19e5ac1567d..2ca84de0454 100644 --- a/app/assets/javascripts/clusters/components/application_row.vue +++ b/app/assets/javascripts/clusters/components/application_row.vue @@ -63,6 +63,11 @@ export default { type: String, required: false, }, + installed: { + type: Boolean, + required: false, + default: false + }, version: { type: String, required: false, @@ -92,15 +97,7 @@ export default { return ( this.status === APPLICATION_STATUS.SCHEDULED || this.status === APPLICATION_STATUS.INSTALLING || - (this.requestStatus === REQUEST_SUBMITTED && !this.statusReason && !this.isInstalled) - ); - }, - isInstalled() { - return ( - this.status === APPLICATION_STATUS.INSTALLED || - this.status === APPLICATION_STATUS.UPDATED || - this.status === APPLICATION_STATUS.UPDATING || - this.status === APPLICATION_STATUS.UPDATE_ERRORED + (this.requestStatus === REQUEST_SUBMITTED && !this.statusReason && !this.installed) ); }, canInstall() { @@ -145,7 +142,7 @@ export default { label = s__('ClusterIntegration|Install'); } else if (this.isInstalling) { label = s__('ClusterIntegration|Installing'); - } else if (this.isInstalled) { + } else if (this.installed) { label = s__('ClusterIntegration|Installed'); } @@ -257,7 +254,7 @@ export default { <div :class="[ rowJsClass, - isInstalled && 'cluster-application-installed', + installed && 'cluster-application-installed', disabled && 'cluster-application-disabled', ]" class="cluster-application-row gl-responsive-table-row gl-responsive-table-row-col-span" diff --git a/app/assets/javascripts/clusters/constants.js b/app/assets/javascripts/clusters/constants.js index 67f481f2afb..17849497c87 100644 --- a/app/assets/javascripts/clusters/constants.js +++ b/app/assets/javascripts/clusters/constants.js @@ -15,9 +15,24 @@ export const APPLICATION_STATUS = { UPDATING: 'updating', UPDATED: 'updated', UPDATE_ERRORED: 'update_errored', + UNINSTALLING: 'uninstalling', + UNINSTALL_ERRORED: 'uninstall_errored', ERROR: 'errored', }; +/* + * The application cannot be in any of the following states without + * not being installed. + */ +export const APPLICATION_INSTALLED_STATUSES = [ + APPLICATION_STATUS.INSTALLED, + APPLICATION_STATUS.UPDATING, + APPLICATION_STATUS.UPDATED, + APPLICATION_STATUS.UPDATE_ERRORED, + APPLICATION_STATUS.UNINSTALLING, + APPLICATION_STATUS.UNINSTALL_ERRORED, +]; + // These are only used client-side export const REQUEST_SUBMITTED = 'request-submitted'; export const REQUEST_FAILURE = 'request-failure'; diff --git a/app/assets/javascripts/clusters/stores/clusters_store.js b/app/assets/javascripts/clusters/stores/clusters_store.js index 92993337f02..2ac6b56cdb6 100644 --- a/app/assets/javascripts/clusters/stores/clusters_store.js +++ b/app/assets/javascripts/clusters/stores/clusters_store.js @@ -1,6 +1,15 @@ import { s__ } from '../../locale'; import { parseBoolean } from '../../lib/utils/common_utils'; -import { INGRESS, JUPYTER, KNATIVE, CERT_MANAGER, RUNNER } from '../constants'; +import { + INGRESS, + JUPYTER, + KNATIVE, + CERT_MANAGER, + RUNNER, + APPLICATION_INSTALLED_STATUSES, +} from '../constants'; + +const isApplicationInstalled = appStatus => APPLICATION_INSTALLED_STATUSES.includes(appStatus); export default class ClusterStore { constructor() { @@ -17,6 +26,7 @@ export default class ClusterStore { statusReason: null, requestStatus: null, requestReason: null, + installed: false, }, ingress: { title: s__('ClusterIntegration|Ingress'), @@ -26,6 +36,7 @@ export default class ClusterStore { requestReason: null, externalIp: null, externalHostname: null, + installed: false, }, cert_manager: { title: s__('ClusterIntegration|Cert-Manager'), @@ -34,6 +45,7 @@ export default class ClusterStore { requestStatus: null, requestReason: null, email: null, + installed: false, }, runner: { title: s__('ClusterIntegration|GitLab Runner'), @@ -44,6 +56,7 @@ export default class ClusterStore { version: null, chartRepo: 'https://gitlab.com/charts/gitlab-runner', upgradeAvailable: null, + installed: false, }, prometheus: { title: s__('ClusterIntegration|Prometheus'), @@ -51,6 +64,7 @@ export default class ClusterStore { statusReason: null, requestStatus: null, requestReason: null, + installed: false, }, jupyter: { title: s__('ClusterIntegration|JupyterHub'), @@ -59,6 +73,7 @@ export default class ClusterStore { requestStatus: null, requestReason: null, hostname: null, + installed: false, }, knative: { title: s__('ClusterIntegration|Knative'), @@ -70,6 +85,7 @@ export default class ClusterStore { isEditingHostName: false, externalIp: null, externalHostname: null, + installed: false, }, }, }; @@ -118,6 +134,7 @@ export default class ClusterStore { ...(this.state.applications[appId] || {}), status, statusReason, + installed: isApplicationInstalled(status), }; if (appId === INGRESS) { diff --git a/spec/frontend/clusters/components/application_row_spec.js b/spec/frontend/clusters/components/application_row_spec.js index b28d0075d06..1e4e814b5e1 100644 --- a/spec/frontend/clusters/components/application_row_spec.js +++ b/spec/frontend/clusters/components/application_row_spec.js @@ -114,21 +114,11 @@ describe('Application Row', () => { expect(vm.installButtonDisabled).toEqual(true); }); - it('has disabled "Installed" when APPLICATION_STATUS.INSTALLED', () => { + it('has disabled "Installed" when application is installed', () => { vm = mountComponent(ApplicationRow, { ...DEFAULT_APPLICATION_STATE, status: APPLICATION_STATUS.INSTALLED, - }); - - expect(vm.installButtonLabel).toEqual('Installed'); - expect(vm.installButtonLoading).toEqual(false); - expect(vm.installButtonDisabled).toEqual(true); - }); - - it('has disabled "Installed" when APPLICATION_STATUS.UPDATING', () => { - vm = mountComponent(ApplicationRow, { - ...DEFAULT_APPLICATION_STATE, - status: APPLICATION_STATUS.UPDATING, + installed: true, }); expect(vm.installButtonLabel).toEqual('Installed'); diff --git a/spec/frontend/clusters/stores/clusters_store_spec.js b/spec/frontend/clusters/stores/clusters_store_spec.js index 161722ec571..c0e8b737ea2 100644 --- a/spec/frontend/clusters/stores/clusters_store_spec.js +++ b/spec/frontend/clusters/stores/clusters_store_spec.js @@ -1,5 +1,5 @@ import ClustersStore from '~/clusters/stores/clusters_store'; -import { APPLICATION_STATUS } from '~/clusters/constants'; +import { APPLICATION_INSTALLED_STATUSES, APPLICATION_STATUS, RUNNER } from '~/clusters/constants'; import { CLUSTERS_MOCK_DATA } from '../services/mock_data'; describe('Clusters Store', () => { @@ -70,6 +70,7 @@ describe('Clusters Store', () => { statusReason: mockResponseData.applications[0].status_reason, requestStatus: null, requestReason: null, + installed: false, }, ingress: { title: 'Ingress', @@ -79,6 +80,7 @@ describe('Clusters Store', () => { requestReason: null, externalIp: null, externalHostname: null, + installed: false, }, runner: { title: 'GitLab Runner', @@ -89,6 +91,7 @@ describe('Clusters Store', () => { version: mockResponseData.applications[2].version, upgradeAvailable: mockResponseData.applications[2].update_available, chartRepo: 'https://gitlab.com/charts/gitlab-runner', + installed: false, }, prometheus: { title: 'Prometheus', @@ -96,6 +99,7 @@ describe('Clusters Store', () => { statusReason: mockResponseData.applications[3].status_reason, requestStatus: null, requestReason: null, + installed: false, }, jupyter: { title: 'JupyterHub', @@ -104,6 +108,7 @@ describe('Clusters Store', () => { requestStatus: null, requestReason: null, hostname: '', + installed: false, }, knative: { title: 'Knative', @@ -115,6 +120,7 @@ describe('Clusters Store', () => { isEditingHostName: false, externalIp: null, externalHostname: null, + installed: false, }, cert_manager: { title: 'Cert-Manager', @@ -123,11 +129,26 @@ describe('Clusters Store', () => { requestStatus: null, requestReason: null, email: mockResponseData.applications[6].email, + installed: false, }, }, }); }); + describe.each(APPLICATION_INSTALLED_STATUSES)('given the current app status is %s', () => { + it('marks application as installed', () => { + const mockResponseData = + CLUSTERS_MOCK_DATA.GET['/gitlab-org/gitlab-shell/clusters/2/status.json'].data; + const runnerAppIndex = 2; + + mockResponseData.applications[runnerAppIndex].status = APPLICATION_STATUS.INSTALLED; + + store.updateStateFromServer(mockResponseData); + + expect(store.state.applications[RUNNER].installed).toBe(true); + }); + }); + it('sets default hostname for jupyter when ingress has a ip address', () => { const mockResponseData = CLUSTERS_MOCK_DATA.GET['/gitlab-org/gitlab-shell/clusters/2/status.json'].data; |