John Cowen fc14a412fd
ui: Partitions Application Layer (#11017)
* Add Partition to all our models

* Add partitions into our serializers/fingerprinting

* Make some amends to a few adapters ready for partitions

* Amend blueprints to avoid linting error

* Update all  our repositories to include partitions, also

Remove enabled/disable nspace repo and just use a nspace with
conditionals

* Ensure nspace and parition parameters always return '' no matter what

* Ensure data-sink finds the model properly

This will later be replaced by a @dataSink decorator but we are find
kicking that can down the road a little more

* Add all the new partition data layer

* Add a way to set the title of the page from inside the route

and make it accessibile via a route announcer

* Make the Consul Route the default/basic one

* Tweak nspace and partition abilities not to check the length

* Thread partition through all the components that need it

* Some ACL tweaks

* Move the entire app to use partitions

* Delete all the tests we no longer need

* Update some Unit tests to use partition

* Fix up KV title tests

* Fix up a few more acceptance tests

* Fixup and temporarily ignore some acceptance tests

* Stop using ember-cli-page-objects fillable as it doesn't seem to work

* Fix lint error

* Remove old ACL related test

* Add a tick after filling out forms

* Fix token warning modal

* Found some more places where we need a partition var

* Fixup some more acceptance tests

* Tokens still needs a repo service for CRUD

* Remove acceptance tests we no longer need

* Fixup and "FIXME ignore" a few tests

* Remove an s

* Disable blocking queries for KV to revert to previous release for now

* Fixup adapter tests to follow async/function resolving interface

* Fixup all the serializer integration tests

* Fixup service/repo integration tests

* Fixup deleting acceptance test

* Fixup some ent tests

* Make sure nspaces passes the dc through for when thats important

* ...aaaand acceptance nspaces with the extra dc param
2021-09-15 19:50:11 +01:00

98 lines
2.9 KiB
JavaScript

import { set, get } from '@ember/object';
import { inject as service } from '@ember/service';
import RepositoryService from 'consul-ui/services/repository';
import { PRIMARY_KEY } from 'consul-ui/models/intention';
import dataSource from 'consul-ui/decorators/data-source';
const modelName = 'intention';
export default class IntentionRepository extends RepositoryService {
@service('env') env;
managedByCRDs = false;
getModelName() {
return modelName;
}
getPrimaryKey() {
return PRIMARY_KEY;
}
create(obj) {
delete obj.Namespace;
return super.create({
Action: 'allow',
...obj,
});
}
isManagedByCRDs() {
if (!this.managedByCRDs) {
this.managedByCRDs = this.store
.peekAll(this.getModelName())
.toArray()
.some(item => item.IsManagedByCRD);
}
return this.managedByCRDs;
}
// legacy intentions are strange that in order to read/write you need access
// to either/or the destination or source
async authorizeBySlug(cb, access, params) {
const [, source, , destination] = params.id.split(':');
const ability = this.permissions.abilityFor(this.getModelName());
params.resources = ability
.generateForSegment(source)
.concat(ability.generateForSegment(destination));
return this.authorizeByPermissions(cb, access, params);
}
async persist(obj) {
const res = await super.persist(...arguments);
// if Action is set it means we are an l4 type intention
// we don't delete these at a UI level incase the user
// would like to switch backwards and forwards between
// allow/deny/l7 in the forms, but once its been saved
// to the backend we then delete them
if (get(res, 'Action.length')) {
set(res, 'Permissions', []);
}
return res;
}
@dataSource('/:partition/:ns/:dc/intentions')
async findAll() {
return super.findAll(...arguments);
}
@dataSource('/:partition/:ns/:dc/intention/:id')
async findBySlug(params) {
let item;
if (params.id === '') {
const defaultNspace = this.env.var('CONSUL_NSPACES_ENABLED') ? '*' : 'default';
item = await this.create({
SourceNS: params.nspace || defaultNspace,
DestinationNS: params.nspace || defaultNspace,
Datacenter: params.dc,
Partition: params.partition,
});
} else {
item = super.findBySlug(...arguments);
}
return item;
}
@dataSource('/:partition/:ns/:dc/intentions/for-service/:id')
async findByService(params, configuration = {}) {
const query = {
dc: params.dc,
nspace: params.nspace,
filter: `SourceName == "${params.id}" or DestinationName == "${params.id}" or SourceName == "*" or DestinationName == "*"`,
};
if (typeof configuration.cursor !== 'undefined') {
query.index = configuration.cursor;
query.uri = configuration.uri;
}
return this.store.query(this.getModelName(), query);
}
}