ui/lib/shared/addon/mixins/crud-catalog.js

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'));
},
});