mirror of https://github.com/rancher/ui.git
274 lines
6.4 KiB
JavaScript
274 lines
6.4 KiB
JavaScript
import Mixin from '@ember/object/mixin';
|
|
import { inject as service } from '@ember/service';
|
|
import { get, set, setProperties } from '@ember/object';
|
|
import C from 'ui/utils/constants';
|
|
import { resolve } from 'rsvp';
|
|
import { later } from '@ember/runloop';
|
|
import { getOwner } from '@ember/application';
|
|
|
|
export default Mixin.create({
|
|
globalStore: service(),
|
|
growl: service(),
|
|
router: service(),
|
|
|
|
app: null,
|
|
appName: null,
|
|
nsName: null,
|
|
appVersion: null,
|
|
cluster: null,
|
|
project: null,
|
|
timeOutAnchor: null,
|
|
|
|
enabled: false,
|
|
ready: false,
|
|
saved: false,
|
|
confirmDisable: false,
|
|
forceUpgrade: false,
|
|
|
|
init() {
|
|
this._super(...arguments);
|
|
|
|
setProperties(this, {
|
|
enabled: !!get(this, 'app') && get(this, 'app.state') !== 'removing',
|
|
ready: !!get(this, 'app') && C.ACTIVEISH_STATES.includes(get(this, 'app.state'))
|
|
})
|
|
|
|
this.startAppStatusChecker();
|
|
},
|
|
|
|
actions: {
|
|
disable() {
|
|
const url = get(this, 'app.links.self');
|
|
|
|
get(this, 'globalStore')
|
|
.rawRequest({
|
|
url,
|
|
method: 'DELETE',
|
|
})
|
|
.then(() => {
|
|
setTimeout(() => {
|
|
window.location.href = window.location.href; // eslint-disable-line no-self-assign
|
|
}, 1000);
|
|
})
|
|
.catch((err) => {
|
|
this.showError(err)
|
|
})
|
|
},
|
|
|
|
promptDisable() {
|
|
set(this, 'confirmDisable', true);
|
|
later(this, function() {
|
|
set(this, 'confirmDisable', false);
|
|
}, 10000);
|
|
},
|
|
},
|
|
|
|
startAppStatusChecker() {
|
|
if ( this.isDestroyed || this.isDestroying ) {
|
|
return;
|
|
}
|
|
|
|
const timeOutAnchor = setTimeout(() => {
|
|
this.queryStatus();
|
|
}, 30000);
|
|
|
|
set(this, 'timeOutAnchor', timeOutAnchor);
|
|
},
|
|
|
|
queryStatus(){
|
|
const url = get(this, 'app.links.self');
|
|
|
|
if ( url ) {
|
|
get(this, 'globalStore').rawRequest({
|
|
url,
|
|
method: 'GET',
|
|
}).then((res) => {
|
|
const app = get(res, 'body');
|
|
|
|
setProperties(this, {
|
|
enabled: get(app, 'state') !== 'removing',
|
|
ready: C.ACTIVEISH_STATES.includes(get(app, 'state')),
|
|
app: get(this, 'globalStore').createRecord({
|
|
type: 'app',
|
|
...app
|
|
}),
|
|
})
|
|
}).finally(() => {
|
|
this.startAppStatusChecker();
|
|
});
|
|
} else {
|
|
set(this, 'ready', false);
|
|
}
|
|
},
|
|
|
|
save(cb, answers, refresh = false) {
|
|
const customAnswers = get(this, 'customAnswers') || {};
|
|
|
|
Object.keys(customAnswers).forEach((key) => {
|
|
answers[key] = customAnswers[key];
|
|
});
|
|
|
|
set(this, 'answers', answers);
|
|
|
|
if ( get(this, 'enabled') ) {
|
|
this.update(cb);
|
|
if (get(this, 'actions.upgrade')) {
|
|
this.send('upgrade');
|
|
}
|
|
} else {
|
|
this.create(cb);
|
|
}
|
|
if (refresh) {
|
|
this.refresh()
|
|
}
|
|
},
|
|
|
|
update(cb) {
|
|
const {
|
|
templateVersion,
|
|
app,
|
|
} = this;
|
|
const { externalIdInfo } = app;
|
|
const currentVersion = get(this, 'apps.firstObject.externalIdInfo.version');
|
|
|
|
if ( !templateVersion || !currentVersion ) {
|
|
return cb(false);
|
|
}
|
|
|
|
const data = {
|
|
answers: get(this, 'answers'),
|
|
externalId: get(app, 'externalId')
|
|
.replace(`version=${ get(externalIdInfo, 'version') }`, `version=${ templateVersion }`),
|
|
};
|
|
|
|
if (this.forceUpgrade) {
|
|
set(data, 'forceUpgrade', true);
|
|
}
|
|
|
|
get(this, 'globalStore').rawRequest({
|
|
url: get(this, 'app.actionLinks.upgrade'),
|
|
method: 'POST',
|
|
data
|
|
})
|
|
.then(() => {
|
|
set(this, 'saved', true);
|
|
})
|
|
.catch((err) => {
|
|
this.showError(err)
|
|
})
|
|
.finally(() => {
|
|
cb();
|
|
});
|
|
},
|
|
|
|
create(cb) {
|
|
let promise;
|
|
|
|
if ( get(this, 'nsExists') ) {
|
|
if (get(this, 'nsNeedMove')) {
|
|
promise = this.moveNamespace(cb);
|
|
} else {
|
|
promise = resolve();
|
|
}
|
|
} else {
|
|
promise = this.createNamespace(cb);
|
|
}
|
|
promise.then(() => {
|
|
get(this, 'globalStore')
|
|
.rawRequest({
|
|
url: `/v3/projects/${ get(this, 'project.id') }/app`,
|
|
method: 'POST',
|
|
data: {
|
|
answers: get(this, 'answers'),
|
|
externalId: get(this, 'appVersion'),
|
|
name: get(this, 'appName'),
|
|
projectId: get(this, 'project.id'),
|
|
targetNamespace: get(this, 'nsName')
|
|
}
|
|
})
|
|
.then((res) => {
|
|
setProperties(this, {
|
|
enabled: true,
|
|
app: get(this, 'globalStore').createRecord({
|
|
...res.body,
|
|
type: 'app',
|
|
}),
|
|
});
|
|
set(this, 'saved', true);
|
|
if (this.doneSaving) {
|
|
this.doneSaving()
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
this.showError(err)
|
|
})
|
|
.finally(() => {
|
|
cb();
|
|
});
|
|
})
|
|
},
|
|
|
|
createNamespace(cb) {
|
|
return get(this, 'globalStore')
|
|
.rawRequest({
|
|
url: `/v3/clusters/${ get(this, 'cluster.id') }/namespace`,
|
|
method: 'POST',
|
|
data: {
|
|
name: get(this, 'nsName'),
|
|
projectId: get(this, 'project.id')
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
this.showError(err)
|
|
cb();
|
|
})
|
|
},
|
|
|
|
moveNamespace(cb) {
|
|
return get(this, 'globalStore')
|
|
.rawRequest({
|
|
url: `/v3/clusters/${ get(this, 'cluster.id') }/namespace/${ get(this, 'namespace.id') }?action=move`,
|
|
method: 'POST',
|
|
data: { projectId: get(this, 'project.id') }
|
|
})
|
|
.catch((err) => {
|
|
this.showError(err)
|
|
cb();
|
|
})
|
|
},
|
|
|
|
willDestroyElement() {
|
|
this.clearTimeOut();
|
|
this._super();
|
|
},
|
|
|
|
clearTimeOut() {
|
|
const timeOutAnchor = get(this, 'timeOutAnchor');
|
|
|
|
if ( timeOutAnchor ){
|
|
clearTimeout(timeOutAnchor);
|
|
set(this, 'timeOutAnchor', timeOutAnchor);
|
|
}
|
|
},
|
|
|
|
refresh() {
|
|
const currentRouteName = get(this, 'router.currentRouteName');
|
|
const routeAddons = ['global-admin.']
|
|
let routeName = currentRouteName
|
|
|
|
routeAddons.map((r) => {
|
|
if (currentRouteName.startsWith(r)) {
|
|
routeName = currentRouteName.replace(r, '')
|
|
}
|
|
})
|
|
|
|
const currentRouteInstance = getOwner(this).lookup(`route:${ routeName }`);
|
|
|
|
currentRouteInstance.send('refresh');
|
|
},
|
|
|
|
showError(err) {
|
|
get(this, 'growl').fromError('Error', get(err, 'body.message'));
|
|
},
|
|
});
|