mirror of https://github.com/hashicorp/consul
106 lines
3.5 KiB
JavaScript
106 lines
3.5 KiB
JavaScript
import SingleRoute from 'consul-ui/routing/single';
|
|
import { inject as service } from '@ember/service';
|
|
import { hash } from 'rsvp';
|
|
import { set, get } from '@ember/object';
|
|
import updateArrayObject from 'consul-ui/utils/update-array-object';
|
|
|
|
import WithTokenActions from 'consul-ui/mixins/token/with-actions';
|
|
|
|
const ERROR_PARSE_RULES = 'Failed to parse ACL rules';
|
|
const ERROR_NAME_EXISTS = 'Invalid Policy: A Policy with Name';
|
|
export default SingleRoute.extend(WithTokenActions, {
|
|
repo: service('repository/token'),
|
|
policyRepo: service('repository/policy'),
|
|
datacenterRepo: service('repository/dc'),
|
|
settings: service('settings'),
|
|
model: function(params, transition) {
|
|
const dc = this.modelFor('dc').dc.Name;
|
|
const policyRepo = get(this, 'policyRepo');
|
|
return this._super(...arguments).then(model => {
|
|
return hash({
|
|
...model,
|
|
...{
|
|
// TODO: I only need these to create a new policy
|
|
datacenters: get(this, 'datacenterRepo').findAll(),
|
|
policy: this.getEmptyPolicy(),
|
|
token: get(this, 'settings').findBySlug('token'),
|
|
items: policyRepo.findAllByDatacenter(dc).catch(function(e) {
|
|
switch (get(e, 'errors.firstObject.status')) {
|
|
case '403':
|
|
case '401':
|
|
// do nothing the SingleRoute will have caught it already
|
|
return;
|
|
}
|
|
throw e;
|
|
}),
|
|
},
|
|
});
|
|
});
|
|
},
|
|
setupController: function(controller, model) {
|
|
this._super(...arguments);
|
|
controller.setProperties(model);
|
|
},
|
|
getEmptyPolicy: function() {
|
|
const dc = this.modelFor('dc').dc.Name;
|
|
return get(this, 'policyRepo').create({ Datacenter: dc });
|
|
},
|
|
actions: {
|
|
// TODO: Some of this could potentially be moved to the repo services
|
|
loadPolicy: function(item, items) {
|
|
const repo = get(this, 'policyRepo');
|
|
const dc = this.modelFor('dc').dc.Name;
|
|
const slug = get(item, repo.getSlugKey());
|
|
repo.findBySlug(slug, dc).then(item => {
|
|
updateArrayObject(items, item, repo.getSlugKey());
|
|
});
|
|
},
|
|
remove: function(item, items) {
|
|
return items.removeObject(item);
|
|
},
|
|
clearPolicy: function() {
|
|
// TODO: I should be able to reset the ember-data object
|
|
// back to it original state?
|
|
// possibly Forms could know how to create
|
|
const controller = get(this, 'controller');
|
|
controller.setProperties({
|
|
policy: this.getEmptyPolicy(),
|
|
});
|
|
},
|
|
createPolicy: function(item, policies, success) {
|
|
get(this, 'policyRepo')
|
|
.persist(item)
|
|
.then(item => {
|
|
set(item, 'CreateTime', new Date().getTime());
|
|
policies.pushObject(item);
|
|
return item;
|
|
})
|
|
.then(function() {
|
|
success();
|
|
})
|
|
.catch(err => {
|
|
if (typeof err.errors !== 'undefined') {
|
|
const error = err.errors[0];
|
|
let prop;
|
|
let message = error.detail;
|
|
switch (true) {
|
|
case message.indexOf(ERROR_PARSE_RULES) === 0:
|
|
prop = 'Rules';
|
|
message = error.detail;
|
|
break;
|
|
case message.indexOf(ERROR_NAME_EXISTS) === 0:
|
|
prop = 'Name';
|
|
message = message.substr(ERROR_NAME_EXISTS.indexOf(':') + 1);
|
|
break;
|
|
}
|
|
if (prop) {
|
|
item.addError(prop, message);
|
|
}
|
|
} else {
|
|
throw err;
|
|
}
|
|
});
|
|
},
|
|
},
|
|
});
|