ui/app/components/modal-rollback-service/component.js

129 lines
3.7 KiB
JavaScript

import { inject as service } from '@ember/service';
import { get, set, computed } from '@ember/object';
import Component from '@ember/component';
import ModalBase from 'shared/mixins/modal-base';
import layout from './template';
import C from 'shared/utils/constants';
import moment from 'moment';
import jsondiffpatch from 'jsondiffpatch';
const HIDDEN_FIELDS = ['created', 'creatorId', 'name', 'ownerReferences', 'removed', 'scale', 'state', 'uuid', 'workloadLabels', 'workloadAnnotations'];
function sanitize(config, keys) {
const result = {};
keys.forEach((key) => {
if (config[key] !== undefined) {
result[key] = config[key]
}
if (key === 'labels' && result.labels) {
delete result.labels['pod-template-hash'];
}
if (key === 'selector' && result.selector && result.selector.matchLabels) {
delete result.selector.matchLabels['pod-template-hash'];
}
});
return result;
}
export default Component.extend(ModalBase, {
growl: service(),
layout,
classNames: ['large-modal'],
keys: null,
name: null,
loading: true,
revisions: null,
revisionId: null,
init() {
this._super(...arguments);
const schema = get(this, 'store').getById('schema', 'workload');
const resourceFields = get(schema, 'resourceFields');
set(this, 'keys', Object.keys(resourceFields).filter((field) => !field.endsWith('Status') && HIDDEN_FIELDS.indexOf(field) === -1));
},
didReceiveAttrs() {
let model = get(this, 'modalService.modalOpts.originalModel').clone();
set(this, 'model', model);
get(this, 'store').rawRequest({
url: get(model, 'links.revisions'),
method: 'GET',
})
.then((revs) => {
set(this, 'revisions', revs.body.data);
})
.catch((err) => {
this.send('cancel');
get(this, 'growl').fromError(err);
})
.finally(() => {
set(this, 'loading', false);
});
},
actions: {
save(cb) {
const id = get(this, 'selected.id');
get(this, 'model').doAction('rollback', { replicaSetId: id, })
.then(() => {
this.send('cancel');
})
.finally(() => {
cb();
});
},
},
choices: computed('model.workloadAnnotations', 'revisions.[]', function() {
return (get(this, 'revisions') || [])
.sortBy('createdTS')
.reverse()
.map((r) => {
let time = moment(get(r, 'created'));
let id = get(r, 'id');
return {
label: `${ id }: ${ time.format('YYYY-MM-DD HH:mm:ss') } (${ time.fromNow() })`,
value: id,
ts: get(r, 'createdTS'),
data: r,
disabled: r.workloadAnnotations[C.LABEL.DEPLOYMENT_REVISION] === get(this, 'model.workloadAnnotations')[C.LABEL.DEPLOYMENT_REVISION]
};
});
}),
current: computed('model.workloadAnnotations', 'revisions.@each.workloadAnnotations', function() {
const currentRevision = get(this, 'model.workloadAnnotations')[C.LABEL.DEPLOYMENT_REVISION];
return (get(this, 'revisions') || []).find((r) => get(r, 'workloadAnnotations')[C.LABEL.DEPLOYMENT_REVISION] === currentRevision);
}),
selected: computed('revisionId', 'revisions.[]', function() {
return (get(this, 'revisions') || []).findBy('id', get(this, 'revisionId'));
}),
diff: computed('current', 'keys', 'selected', function() {
if (get(this, 'current') && get(this, 'selected')) {
let left = sanitize(get(this, 'current'), get(this, 'keys'));
let right = sanitize(get(this, 'selected'), get(this, 'keys'));
var delta = jsondiffpatch.diff(left, right);
jsondiffpatch.formatters.html.hideUnchanged();
return jsondiffpatch.formatters.html.format(delta, left).htmlSafe();
}
return null;
}),
});