From ee5c3e3aa53b7fe2a92143a86b6e5aa6cad07e48 Mon Sep 17 00:00:00 2001
From: Kenia <19161242+kaxcode@users.noreply.github.com>
Date: Wed, 31 Mar 2021 10:55:31 -0400
Subject: [PATCH] ui: Auth Methods - Namespace rules tab (#9935)
* Add mock data for NamespaceRules
* Create NamespaceTable component and styling
* Add NamespaceRules route and add to model
* Create Namespace Rules tab and implement with flag to only show in ent
* Add emptystate to namespace rules page
* Rename namespace-rules to be nspace-rules
* Rename NamespaceTable to be NspaceList
---
.../components/consul/auth-method/index.scss | 36 +++++++++++++++++--
.../consul/auth-method/nspace-list/index.hbs | 19 ++++++++++
.../consul-ui/app/models/auth-method.js | 1 +
ui/packages/consul-ui/app/router.js | 3 ++
.../dc/acls/auth-methods/show/nspace-rules.js | 16 +++++++++
.../templates/dc/acls/auth-methods/show.hbs | 3 ++
.../acls/auth-methods/show/nspace-rules.hbs | 21 +++++++++++
.../consul-ui/mock-api/v1/acl/auth-method/_ | 15 ++++++++
ui/packages/consul-ui/translations/en-us.yaml | 2 ++
9 files changed, 113 insertions(+), 3 deletions(-)
create mode 100644 ui/packages/consul-ui/app/components/consul/auth-method/nspace-list/index.hbs
create mode 100644 ui/packages/consul-ui/app/routes/dc/acls/auth-methods/show/nspace-rules.js
create mode 100644 ui/packages/consul-ui/app/templates/dc/acls/auth-methods/show/nspace-rules.hbs
diff --git a/ui/packages/consul-ui/app/components/consul/auth-method/index.scss b/ui/packages/consul-ui/app/components/consul/auth-method/index.scss
index de2f4eb28b..f0f1130f0b 100644
--- a/ui/packages/consul-ui/app/components/consul/auth-method/index.scss
+++ b/ui/packages/consul-ui/app/components/consul/auth-method/index.scss
@@ -24,9 +24,17 @@
font-weight: $typo-weight-semibold;
font-size: $typo-size-700;
}
- tbody td {
- font-size: $typo-size-600;
- color: $black;
+ tbody {
+ td {
+ font-size: $typo-size-600;
+ color: $black;
+ }
+ tr {
+ cursor: default;
+ }
+ tr:hover {
+ box-shadow: none;
+ }
}
}
}
@@ -54,4 +62,26 @@
}
}
+// Nspace List
+.consul-auth-method-nspace-list {
+ thead {
+ td {
+ color: var(--gray-500) !important;
+ font-weight: $typo-weight-semibold !important;
+ font-size: $typo-size-700 !important;
+ }
+ }
+ tbody {
+ td {
+ font-size: $typo-size-600;
+ color: $black;
+ }
+ tr {
+ cursor: default;
+ }
+ tr:hover {
+ box-shadow: none;
+ }
+ }
+}
diff --git a/ui/packages/consul-ui/app/components/consul/auth-method/nspace-list/index.hbs b/ui/packages/consul-ui/app/components/consul/auth-method/nspace-list/index.hbs
new file mode 100644
index 0000000000..841db0093b
--- /dev/null
+++ b/ui/packages/consul-ui/app/components/consul/auth-method/nspace-list/index.hbs
@@ -0,0 +1,19 @@
+
+
+
+
+ {{t "models.auth-method.Selector"}} |
+ {{t "models.auth-method.BindNamespace"}} |
+
+
+
+ {{#each @items as |item|}}
+
+ {{item.Selector}} |
+ {{item.BindNamespace}} |
+
+ {{/each}}
+
+
+
+
diff --git a/ui/packages/consul-ui/app/models/auth-method.js b/ui/packages/consul-ui/app/models/auth-method.js
index a2aaf6c792..38da49b629 100644
--- a/ui/packages/consul-ui/app/models/auth-method.js
+++ b/ui/packages/consul-ui/app/models/auth-method.js
@@ -14,6 +14,7 @@ export default class AuthMethod extends Model {
@attr('string', { defaultValue: () => '' }) DisplayName;
@attr('string', { defaultValue: () => 'local' }) TokenLocality;
@attr('string') Type;
+ @attr() NamespaceRules;
@or('DisplayName', 'Name') MethodName;
@attr() Config;
@attr('string') MaxTokenTTL;
diff --git a/ui/packages/consul-ui/app/router.js b/ui/packages/consul-ui/app/router.js
index 14cb6656f5..f17c65d200 100644
--- a/ui/packages/consul-ui/app/router.js
+++ b/ui/packages/consul-ui/app/router.js
@@ -199,6 +199,9 @@ export const routes = {
'binding-rules': {
_options: { path: '/binding-rules' },
},
+ 'nspace-rules': {
+ _options: { path: '/nspace-rules' },
+ },
},
},
},
diff --git a/ui/packages/consul-ui/app/routes/dc/acls/auth-methods/show/nspace-rules.js b/ui/packages/consul-ui/app/routes/dc/acls/auth-methods/show/nspace-rules.js
new file mode 100644
index 0000000000..8ea762d012
--- /dev/null
+++ b/ui/packages/consul-ui/app/routes/dc/acls/auth-methods/show/nspace-rules.js
@@ -0,0 +1,16 @@
+import Route from 'consul-ui/routing/route';
+
+export default class NspaceRulesRoute extends Route {
+ model() {
+ const parent = this.routeName
+ .split('.')
+ .slice(0, -1)
+ .join('.');
+ return this.modelFor(parent);
+ }
+
+ setupController(controller, model) {
+ super.setupController(...arguments);
+ controller.setProperties(model);
+ }
+}
diff --git a/ui/packages/consul-ui/app/templates/dc/acls/auth-methods/show.hbs b/ui/packages/consul-ui/app/templates/dc/acls/auth-methods/show.hbs
index 52e86479cf..489d36409a 100644
--- a/ui/packages/consul-ui/app/templates/dc/acls/auth-methods/show.hbs
+++ b/ui/packages/consul-ui/app/templates/dc/acls/auth-methods/show.hbs
@@ -27,6 +27,9 @@
compact
(array
(hash label="General info" href=(href-to "dc.acls.auth-methods.show.auth-method") selected=(is-href "dc.acls.auth-methods.show.auth-method"))
+ (if (env "CONSUL_NSPACES_ENABLED")
+ (hash label="Namespace rules" href=(href-to "dc.acls.auth-methods.show.nspace-rules") selected=(is-href "dc.acls.auth-methods.show.nspace-rules"))
+ '')
(hash label="Binding rules" href=(href-to "dc.acls.auth-methods.show.binding-rules") selected=(is-href "dc.acls.auth-methods.show.binding-rules"))
)
}}/>
diff --git a/ui/packages/consul-ui/app/templates/dc/acls/auth-methods/show/nspace-rules.hbs b/ui/packages/consul-ui/app/templates/dc/acls/auth-methods/show/nspace-rules.hbs
new file mode 100644
index 0000000000..9a58a6527f
--- /dev/null
+++ b/ui/packages/consul-ui/app/templates/dc/acls/auth-methods/show/nspace-rules.hbs
@@ -0,0 +1,21 @@
+
+
+{{#if true}}
+
A set of rules that can control which namespace tokens created via this auth method will be created within. Unlike binding rules, the first matching namespace rule wins.
+
+{{else}}
+
+
+ No namespace rules
+
+
+ A set of rules that can control which namespace tokens created via this auth method will be created within. Unlike binding rules, the first matching namespace rule wins.
+
+
+
+ Read the documentation
+
+
+
+{{/if}}
+
diff --git a/ui/packages/consul-ui/mock-api/v1/acl/auth-method/_ b/ui/packages/consul-ui/mock-api/v1/acl/auth-method/_
index fb231512a3..c2313674a2 100644
--- a/ui/packages/consul-ui/mock-api/v1/acl/auth-method/_
+++ b/ui/packages/consul-ui/mock-api/v1/acl/auth-method/_
@@ -28,6 +28,20 @@ SmTjcs+lhMxg4fFY6lBpiEVFiGUjGRR+61R67Lz6U4KJeLNcCm07QwFYKBmpi08g
const listClaimMappings = {
"http://example.com/example-1": `${fake.hacker.noun()}`
}
+ const namespaceRules = `[
+ {
+ "Selector": "${fake.hacker.noun()} in list.group",
+ "BindNamespace": "dc-1"
+ },
+ {
+ "Selector": "serviceaccount.namespace!=${fake.hacker.noun()}",
+ "BindNamespace": "dc-2"
+ },
+ {
+ "Selector": "serviceaccount.namespace==${fake.hacker.noun()}",
+ "BindNamespace": "dc-3"
+ }
+ ]`;
let config = {};
switch(type) {
@@ -91,6 +105,7 @@ SmTjcs+lhMxg4fFY6lBpiEVFiGUjGRR+61R67Lz6U4KJeLNcCm07QwFYKBmpi08g
"DisplayName": "${fake.hacker.noun()}",
"MaxTokenTTL": "${fake.random.number({min: 0, max: 60})}m${fake.random.number({min: 0, max: 60})}s",
"TokenLocality": "${fake.helpers.randomize(['local', 'global', ''])}",
+ "NamespaceRules": ${namespaceRules},
"Config": ${JSON.stringify(config)},
"CreateIndex": ${fake.random.number()},
"ModifyIndex": 10
diff --git a/ui/packages/consul-ui/translations/en-us.yaml b/ui/packages/consul-ui/translations/en-us.yaml
index 85a44a0b16..9aa5afc751 100644
--- a/ui/packages/consul-ui/translations/en-us.yaml
+++ b/ui/packages/consul-ui/translations/en-us.yaml
@@ -192,6 +192,8 @@ models:
TokenLocality: Token locality
Type: Type
MaxTokenTTL: Maximum token TTL
+ Selector: Selector
+ BindNamespace: Bind Namespace
Config:
Host: Host
CACert: CA Cert