Files
nomad/ui/app/controllers/administration/policies/index.js
Phil Renaud 86c858cdc3 [ui] Sentinel Policies CRUD UI (#20483)
* Gallery allows picking stuff

* Small fixes

* added sentinel templates

* Can set enforcement level on policies

* Working on the interactive sentinel dev mode

* Very rough development flow on FE

* Changed position in gutter menu

* More sentinel stuff

* PR cleanup: removed testmode, removed unneeded mixins and deps

* Heliosification

* Index-level sentinel policy deletion and page title fixes

* Makes the Canaries sentinel policy real and then comments out the unfinished ones

* rename Access Control to Administration in prep for moving Sentinel Policies and Node Pool admin there

* Sentinel policies moved within the Administration section

* Mirage fixture for sentinel policy endpoints

* Description length check and 500 prevention

* Sync review PR feedback addressed, implied butons on radio cards

* Cull un-used sentinel policies

---------

Co-authored-by: Mike Nomitch <mail@mikenomitch.com>
2024-05-22 16:41:50 -04:00

95 lines
2.1 KiB
JavaScript

/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: BUSL-1.1
*/
import Controller from '@ember/controller';
import { inject as service } from '@ember/service';
import { action } from '@ember/object';
import { task } from 'ember-concurrency';
export default class AccessControlPoliciesIndexController extends Controller {
@service router;
@service notifications;
@service can;
get columns() {
const defaultColumns = [
{
key: 'name',
label: 'Name',
isSortable: true,
},
{
key: 'description',
label: 'Description',
},
];
const tokensColumn = {
key: 'tokens',
label: 'Tokens',
isSortable: true,
};
const deleteColumn = {
key: 'delete',
label: 'Delete',
};
return [
...defaultColumns,
...(this.can.can('list token') ? [tokensColumn] : []),
...(this.can.can('destroy policy') ? [deleteColumn] : []),
];
}
get policies() {
return this.model.policies.map((policy) => {
policy.tokens = (this.model.tokens || []).filter((token) => {
return token.policies.includes(policy);
});
return policy;
});
}
@action openPolicy(policy) {
this.router.transitionTo('administration.policies.policy', policy.name);
}
@action goToNewPolicy() {
this.router.transitionTo('administration.policies.new');
}
@task(function* (policy) {
try {
yield policy.deleteRecord();
yield policy.save();
// Cleanup: Remove references from roles and tokens
this.store.peekAll('role').forEach((role) => {
role.policies.removeObject(policy);
});
this.store.peekAll('token').forEach((token) => {
token.policies.removeObject(policy);
});
if (this.store.peekRecord('policy', policy.id)) {
this.store.unloadRecord(policy);
}
this.notifications.add({
title: `Policy ${policy.name} successfully deleted`,
color: 'success',
});
} catch (err) {
this.error = {
title: 'Error deleting policy',
description: err,
};
throw err;
}
})
deletePolicy;
}