Determine if app is installed in the store
- Create installed property for cluster apps - Pass installed property to the application_row component
This commit is contained in:
parent
b15a78dfdd
commit
8f6ec252a3
|
@ -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"
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -1,6 +1,23 @@
|
|||
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);
|
||||
|
||||
const applicationInitialState = {
|
||||
status: null,
|
||||
statusReason: null,
|
||||
requestReason: null,
|
||||
requestStatus: null,
|
||||
installed: false,
|
||||
};
|
||||
|
||||
export default class ClusterStore {
|
||||
constructor() {
|
||||
|
@ -12,60 +29,39 @@ export default class ClusterStore {
|
|||
statusReason: null,
|
||||
applications: {
|
||||
helm: {
|
||||
...applicationInitialState,
|
||||
title: s__('ClusterIntegration|Helm Tiller'),
|
||||
status: null,
|
||||
statusReason: null,
|
||||
requestStatus: null,
|
||||
requestReason: null,
|
||||
},
|
||||
ingress: {
|
||||
...applicationInitialState,
|
||||
title: s__('ClusterIntegration|Ingress'),
|
||||
status: null,
|
||||
statusReason: null,
|
||||
requestStatus: null,
|
||||
requestReason: null,
|
||||
externalIp: null,
|
||||
externalHostname: null,
|
||||
},
|
||||
cert_manager: {
|
||||
...applicationInitialState,
|
||||
title: s__('ClusterIntegration|Cert-Manager'),
|
||||
status: null,
|
||||
statusReason: null,
|
||||
requestStatus: null,
|
||||
requestReason: null,
|
||||
email: null,
|
||||
},
|
||||
runner: {
|
||||
...applicationInitialState,
|
||||
title: s__('ClusterIntegration|GitLab Runner'),
|
||||
status: null,
|
||||
statusReason: null,
|
||||
requestStatus: null,
|
||||
requestReason: null,
|
||||
version: null,
|
||||
chartRepo: 'https://gitlab.com/charts/gitlab-runner',
|
||||
upgradeAvailable: null,
|
||||
},
|
||||
prometheus: {
|
||||
...applicationInitialState,
|
||||
title: s__('ClusterIntegration|Prometheus'),
|
||||
status: null,
|
||||
statusReason: null,
|
||||
requestStatus: null,
|
||||
requestReason: null,
|
||||
},
|
||||
jupyter: {
|
||||
...applicationInitialState,
|
||||
title: s__('ClusterIntegration|JupyterHub'),
|
||||
status: null,
|
||||
statusReason: null,
|
||||
requestStatus: null,
|
||||
requestReason: null,
|
||||
hostname: null,
|
||||
},
|
||||
knative: {
|
||||
...applicationInitialState,
|
||||
title: s__('ClusterIntegration|Knative'),
|
||||
status: null,
|
||||
statusReason: null,
|
||||
requestStatus: null,
|
||||
requestReason: null,
|
||||
hostname: null,
|
||||
isEditingHostName: false,
|
||||
externalIp: null,
|
||||
|
@ -118,6 +114,7 @@ export default class ClusterStore {
|
|||
...(this.state.applications[appId] || {}),
|
||||
status,
|
||||
statusReason,
|
||||
installed: isApplicationInstalled(status),
|
||||
};
|
||||
|
||||
if (appId === INGRESS) {
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue