ui/lib/shared/addon/mixins/upgrade-component.js

159 lines
4.2 KiB
JavaScript

import { once } from '@ember/runloop';
import { get, set, computed, observer, setProperties } from '@ember/object';
import Mixin from '@ember/object/mixin';
import C from 'ui/utils/constants';
import { inject as service } from "@ember/service";
import Semver from 'npm:semver';
const NONE = 'none',
LOADING = 'loading',
CURRENT = 'current',
AVAILABLE = 'available',
REQUIRED = 'required',
INPROGRESS = 'inprogress',
UPGRADED = 'upgraded',
NOTFOUND = 'notfound',
ERROR = 'error';
const INPROGRESS_STATES = [
'upgrading',
'canceled-upgrade',
'canceling-rollback',
'canceling-upgrade',
'finishing-upgrade',
'rolling-back',
];
export default Mixin.create({
model : null,
upgradeOnly : true,
intl : service(),
catalog : service(),
router: service(),
upgradeInfo : null,
upgradeStatus : null,
latestVersion : null,
init() {
this._super(...arguments);
this.updateStatus();
},
color: computed('upgradeStatus', function() {
switch ( get(this, 'upgradeStatus') ) {
case NONE:
return 'hide';
case CURRENT:
case LOADING:
return 'bg-default';
case NOTFOUND:
case ERROR:
case INPROGRESS:
return 'bg-disabled';
case REQUIRED:
return 'bg-error';
case AVAILABLE:
case UPGRADED:
return 'bg-warning';
}
}),
currentVersion: computed('model.externalIdInfo.{version}','model.externalId', function() {
let text = get(this, 'intl').findTranslationByKey('upgradeBtn.version.current');
let version = get(this, 'model.externalIdInfo.version');
if (typeof version === 'string' || typeof version === 'number') {
return `${text}: ${get(this, 'upgradeInfo.version')}`;
} else {
return null;
}
}),
externalIdChanged: observer('model.{externalId,state}', function() {
once(() => {
this.updateStatus();
});
}),
doUpgrade() {
let status = get(this, 'upgradeStatus');
if ( [REQUIRED,AVAILABLE,CURRENT].indexOf(status) >= 0 ) {
let templateId = get(this, 'model.externalIdInfo.templateId');
let versionId = get(this, 'latestVersion');
let catalogId = get(this, 'model.externalIdInfo.catalog');
get(this, 'router').transitionTo('catalog-tab.launch', templateId, {queryParams: {
upgrade: versionId,
catalog: catalogId,
namespaceId: get(this, 'model.installNamespace'),
appId: get(this, 'model.id'),
}});
} else if ( status === UPGRADED ) {
get(this, 'model').send('finishUpgrade');
}
},
updateStatus() {
let state = get(this, 'model.state');
let info = get(this, 'model.externalIdInfo');
let catalogTemplate = get(this, 'model.catalogTemplate');
let upgradeVersions={};
if ( state === 'upgraded' ) {
set(this, 'upgradeStatus', UPGRADED);
return;
}
if ( INPROGRESS_STATES.indexOf(state) >= 0 ) {
set(this, 'upgradeStatus', INPROGRESS);
return;
}
if ( info && C.EXTERNAL_ID.UPGRADEABLE.indexOf(info.kind) >= 0 ) {
set(this, 'upgradeStatus', LOADING);
} else {
set(this, 'upgradeStatus', NONE);
}
upgradeVersions = parseUpgradeVersions(catalogTemplate.get('versionLinks'), info.version, get(this, 'model'));
if (Object.keys(upgradeVersions).length >= 1) {
setProperties(this, {
upgradeStatus: AVAILABLE,
latestVersion: Object.keys(upgradeVersions)[Object.keys(upgradeVersions).length-1],
});
} else {
set(this, 'upgradeStatus', NONE);
}
// console.log('upgradeVersions', upgradeVersions);
function parseUpgradeVersions(allVersions, currentVersion) {
let keys = Object.keys(allVersions);
let upgrades = {};
keys.forEach( k => {
let gt = Semver.gt(k, currentVersion);
if (gt) {
upgrades[k] = allVersions[k];
}
// console.log(k, currentVersion, gt);
});
return upgrades;
}
setProperties(this, {
allVersions: catalogTemplate.get('versionLinks'),
upgradeVersions: upgradeVersions
});
return;
},
});