ui/lib/alert/addon/edit/route.js

255 lines
6.6 KiB
JavaScript

import Route from '@ember/routing/route';
import { hash } from 'rsvp';
import { get, setProperties, set } from '@ember/object';
import { inject as service } from '@ember/service';
import { reads } from '@ember/object/computed'
export default Route.extend({
globalStore: service(),
scope: service(),
growl: service(),
pageScope: reads('scope.currentPageScope'),
model(params) {
const pageScope = get(this, 'pageScope');
const groupId = params.alert_id;
if (pageScope === 'cluster') {
const cluster = window.l('route:application').modelFor('authenticated.cluster');
const clusterId = cluster.get('id');
return this.loadClusterResource({
clusterId,
groupId
});
} else {
const project = window.l('route:application').modelFor('authenticated.project').get('project');
const projectId = project.get('id');
const clusterId = project.get('clusterId');
return this.loadProjectResource({
projectId,
clusterId,
groupId
});
}
},
isMonitoringEnabled() {
const ps = get(this, 'pageScope');
if (ps === 'cluster') {
return get(this, 'scope.currentCluster.enableClusterMonitoring')
} else {
return get(this, 'scope.currentProject.enableProjectMonitoring')
}
},
getNewClusterAlert(alert) {
const gs = get(this, 'globalStore');
const nodeRule = gs.createRecord({ type: 'nodeRule' });
const systemServiceRule = gs.createRecord({ type: 'systemServiceRule' });
const clusterScanRule = gs.createRecord({
type: 'clusterScanRule',
scanRunType: 'manual'
});
const eventRule = gs.createRecord({ type: 'eventRule' });
const metricRule = gs.createRecord({
type: 'metricRule',
comparison: 'greater-than',
duration: '5m',
thresholdValue: 0,
})
const t = get(alert, 'targetType');
const et = get(alert, 'eventRule.eventType');
set(alert, '_targetType', t);
switch (t) {
case 'event':
switch (et) {
case 'Normal':
set(alert, '_targetType', 'normalEvent');
break;
case 'Warning':
set(alert, '_targetType', 'warningEvent');
break;
}
setProperties(alert, {
nodeRule,
systemServiceRule,
metricRule,
clusterScanRule,
});
break;
case 'node':
case 'nodeSelector':
setProperties(alert, {
eventRule,
systemServiceRule,
metricRule,
clusterScanRule,
});
break;
case 'systemService':
setProperties(alert, {
nodeRule,
eventRule,
metricRule,
clusterScanRule,
});
break;
case 'metric':
setProperties(alert, {
nodeRule,
systemServiceRule,
eventRule,
clusterScanRule,
})
break;
case 'cisScan':
setProperties(alert, {
nodeRule,
systemServiceRule,
eventRule,
metricRule,
})
break;
}
return alert;
},
loadClusterResource({ clusterId, groupId }) {
const globalStore = get(this, 'globalStore');
const opt = { filter: { clusterId } };
let metrics
if (this.isMonitoringEnabled()) {
metrics = globalStore.rawRequest({
url: `monitormetrics?action=listclustermetricname&limit=-1`,
method: 'POST',
data: { clusterId, }
}).catch((err = {}) => {
get(this, 'growl').fromError(get(err, 'body.message'));
});
}
return hash({
nodes: globalStore.find('node', null, opt),
notifiers: globalStore.findAll('notifier'),
alertRules: globalStore.find('clusterAlertRule'),
alertGroup: globalStore.find('clusterAlertGroup', groupId),
metrics,
}).then(({
nodes, notifiers, alertRules, alertGroup, metrics
}) => {
return {
nodes,
notifiers,
alertRules: alertRules.filter((g) => g.groupId === groupId).map((a) => {
const alert = a.clone()
return this.getNewClusterAlert(alert)
}),
alertGroup: alertGroup.clone(),
metrics: metrics && metrics.body && metrics.body.names,
mode: 'edit',
level: 'group',
}
});
},
getNewProjectAlert(alert) {
const gs = get(this, 'globalStore');
const podRule = gs.createRecord({ type: 'podRule' });
const workloadRule = gs.createRecord({ type: 'workloadRule' });
const metricRule = gs.createRecord({
type: 'metricRule',
comparison: 'greater-than',
duration: '5m',
thresholdValue: 0,
})
const t = get(alert, 'targetType');
set(alert, '_targetType', t);
switch (t) {
case 'pod':
setProperties(alert, {
metricRule,
workloadRule,
})
break;
case 'workload':
case 'workloadSelector':
setProperties(alert, {
podRule,
metricRule,
})
break;
case 'metric':
setProperties(alert, {
podRule,
workloadRule,
})
break;
}
return alert;
},
loadProjectResource({
clusterId, projectId, groupId
}) {
const store = get(this, 'store');
const globalStore = get(this, 'globalStore');
const opt = { filter: { projectId } };
let metrics
if (this.isMonitoringEnabled()) {
metrics = globalStore.rawRequest({
url: `monitormetrics?action=listprojectmetricname&limit=-1`,
method: 'POST',
data: { projectId, }
}).catch((err = {}) => {
get(this, 'growl').fromError(get(err, 'body.message'));
});
}
return hash({
pods: store.find('pod', null),
statefulsets: store.find('statefulset', null, opt),
daemonsets: store.find('daemonset', null, opt),
deployments: store.find('deployment', null, opt),
notifiers: globalStore.find('notifier', null, { filter: { clusterId } }),
metrics,
alertRules: globalStore.find('projectAlertRule'),
alertGroup: globalStore.find('projectAlertGroup', groupId),
}).then(({
pods, statefulsets, daemonsets, deployments, notifiers, metrics, alertRules, alertGroup
}) => {
return {
pods,
statefulsets,
daemonsets,
deployments,
notifiers,
metrics: metrics && metrics.body && metrics.body.names,
alertRules: alertRules.filter((g) => g.groupId === groupId).map((a) => {
const alert = a.clone()
return this.getNewProjectAlert(alert)
}),
alertGroup: alertGroup.clone(),
mode: 'edit',
level: 'group',
}
});
},
});