mirror of https://github.com/rancher/ui.git
129 lines
3.8 KiB
JavaScript
129 lines
3.8 KiB
JavaScript
import Mixin from '@ember/object/mixin';
|
|
import { on } from '@ember/object/evented';
|
|
import {
|
|
set, get, computed, observer, setProperties
|
|
} from '@ember/object';
|
|
import { inject as service } from '@ember/service';
|
|
import { all as PromiseAll } from 'rsvp';
|
|
import UpgradeComponent from 'shared/mixins/upgrade-component';
|
|
import { compare as compareVersion } from 'ui/utils/parse-version';
|
|
|
|
const PREFIX = 'cattle-global-data';
|
|
const AVAILABLE = 'available';
|
|
|
|
export default Mixin.create(UpgradeComponent, {
|
|
scope: service(),
|
|
catalog: service(),
|
|
globalStore: service(),
|
|
|
|
apps: null,
|
|
latestVersion: null,
|
|
templateId: null,
|
|
|
|
templateVersion: null,
|
|
|
|
checkUpdateStatus: on('init', observer('apps', function() {
|
|
get(this, 'catalog').fetchTemplate(`${ PREFIX }:${ get(this, 'templateId') }`).then((template) => {
|
|
const toUpgrade = [];
|
|
|
|
(get(this, 'apps') || []).forEach((app) => {
|
|
set(this, 'model', app);
|
|
this.updateStatus();
|
|
if ( AVAILABLE === get(this, 'upgradeStatus') ) {
|
|
toUpgrade.push(app);
|
|
}
|
|
});
|
|
|
|
set(this, 'toUpgrade', toUpgrade);
|
|
|
|
if (template.labels) {
|
|
set(this, 'templateLables', template.labels)
|
|
}
|
|
|
|
this.initAvailableVersions(template);
|
|
});
|
|
})),
|
|
|
|
appVersion: computed('templateVersion', 'templateName', function() {
|
|
const { templateVersion, templateName } = this
|
|
|
|
return `catalog://?catalog=system-library&template=${ templateName }&version=${ templateVersion }`
|
|
}),
|
|
|
|
initAvailableVersions(template) {
|
|
const apps = get(this, 'apps') || [];
|
|
const links = get(template, 'versionLinks');
|
|
|
|
const versions = Object.keys(links).filter((key) => !!links[key])
|
|
.map((key) => ({
|
|
label: key,
|
|
value: key,
|
|
})).sort((a, b) => compareVersion(a.value, b.value));
|
|
|
|
if ( get(versions, 'length') === 0 ) {
|
|
set(this, 'availableVersions', []);
|
|
|
|
return;
|
|
}
|
|
|
|
if ( get(apps, 'length') ) {
|
|
const currentVersion = get(apps, 'firstObject.externalIdInfo.version');
|
|
const availableVersions = versions.filter((v) => compareVersion(v.value, currentVersion) > 0);
|
|
|
|
availableVersions.unshift({
|
|
value: currentVersion,
|
|
label: currentVersion
|
|
});
|
|
setProperties(this, {
|
|
availableVersions,
|
|
templateVersion: currentVersion
|
|
});
|
|
} else {
|
|
setProperties(this, {
|
|
availableVersions: versions,
|
|
templateVersion: get(versions, 'lastObject.value')
|
|
});
|
|
}
|
|
},
|
|
|
|
upgradeAvailable: computed('toUpgrade', function() {
|
|
const toUpgrade = get(this, 'toUpgrade') || [];
|
|
|
|
return get(toUpgrade, 'length') > 0;
|
|
}),
|
|
|
|
actions: {
|
|
upgrade() {
|
|
const currentVersion = get(this, 'apps.firstObject.externalIdInfo.version');
|
|
const templateVersion = get(this, 'templateVersion');
|
|
|
|
if ( !templateVersion || !currentVersion || templateVersion === currentVersion ) {
|
|
return;
|
|
}
|
|
|
|
set(this, 'availableVersions', get(this, 'availableVersions').slice(get(this, 'availableVersions').findIndex((v) => v.value === templateVersion)));
|
|
|
|
const requests = [];
|
|
const apps = get(this, 'toUpgrade') || [];
|
|
|
|
apps.forEach((app) => {
|
|
const externalInfo = get(app, 'externalIdInfo');
|
|
|
|
requests.push(get(this, 'globalStore').rawRequest({
|
|
url: `/v3/project/${ get(app, 'projectId') }/apps/${ get(app, 'id') }`,
|
|
method: 'PUT',
|
|
data: {
|
|
projectId: get(app, 'projectId'),
|
|
targetNamespace: get(app, 'targetNamespace'),
|
|
externalId: get(app, 'externalId')
|
|
.replace(`version=${ get(externalInfo, 'version') }`, `version=${ templateVersion }`)
|
|
}
|
|
}));
|
|
});
|
|
set(this, 'toUpgrade', []);
|
|
|
|
return PromiseAll(requests);
|
|
}
|
|
},
|
|
});
|