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
This commit is contained in:
parent
0c2ec8c13d
commit
1be5b80d26
|
@ -24,9 +24,17 @@
|
||||||
font-weight: $typo-weight-semibold;
|
font-weight: $typo-weight-semibold;
|
||||||
font-size: $typo-size-700;
|
font-size: $typo-size-700;
|
||||||
}
|
}
|
||||||
tbody td {
|
tbody {
|
||||||
font-size: $typo-size-600;
|
td {
|
||||||
color: $black;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
<div class="consul-auth-method-nspace-list">
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<td>{{t "models.auth-method.Selector"}}</td>
|
||||||
|
<td>{{t "models.auth-method.BindNamespace"}}</td>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{{#each @items as |item|}}
|
||||||
|
<tr>
|
||||||
|
<td>{{item.Selector}}</td>
|
||||||
|
<td>{{item.BindNamespace}}</td>
|
||||||
|
</tr>
|
||||||
|
{{/each}}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
|
@ -14,6 +14,7 @@ export default class AuthMethod extends Model {
|
||||||
@attr('string', { defaultValue: () => '' }) DisplayName;
|
@attr('string', { defaultValue: () => '' }) DisplayName;
|
||||||
@attr('string', { defaultValue: () => 'local' }) TokenLocality;
|
@attr('string', { defaultValue: () => 'local' }) TokenLocality;
|
||||||
@attr('string') Type;
|
@attr('string') Type;
|
||||||
|
@attr() NamespaceRules;
|
||||||
@or('DisplayName', 'Name') MethodName;
|
@or('DisplayName', 'Name') MethodName;
|
||||||
@attr() Config;
|
@attr() Config;
|
||||||
@attr('string') MaxTokenTTL;
|
@attr('string') MaxTokenTTL;
|
||||||
|
|
|
@ -199,6 +199,9 @@ export const routes = {
|
||||||
'binding-rules': {
|
'binding-rules': {
|
||||||
_options: { path: '/binding-rules' },
|
_options: { path: '/binding-rules' },
|
||||||
},
|
},
|
||||||
|
'nspace-rules': {
|
||||||
|
_options: { path: '/nspace-rules' },
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -27,6 +27,9 @@
|
||||||
compact
|
compact
|
||||||
(array
|
(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"))
|
(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"))
|
(hash label="Binding rules" href=(href-to "dc.acls.auth-methods.show.binding-rules") selected=(is-href "dc.acls.auth-methods.show.binding-rules"))
|
||||||
)
|
)
|
||||||
}}/>
|
}}/>
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
|
||||||
|
<div class="tab-section">
|
||||||
|
{{#if true}}
|
||||||
|
<p>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.</p>
|
||||||
|
<Consul::AuthMethod::NspaceList @items={{item.NamespaceRules}} />
|
||||||
|
{{else}}
|
||||||
|
<EmptyState>
|
||||||
|
<BlockSlot @name="header">
|
||||||
|
<h2>No namespace rules</h2>
|
||||||
|
</BlockSlot>
|
||||||
|
<BlockSlot @name="body">
|
||||||
|
<p>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.</p>
|
||||||
|
</BlockSlot>
|
||||||
|
<BlockSlot @name="actions">
|
||||||
|
<li class="docs-link">
|
||||||
|
<a href="{{env 'CONSUL_DOCS_API_URL'}}/acl/auth-methods#namespacerules" rel="noopener noreferrer" target="_blank">Read the documentation</a>
|
||||||
|
</li>
|
||||||
|
</BlockSlot>
|
||||||
|
</EmptyState>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
|
@ -28,6 +28,20 @@ SmTjcs+lhMxg4fFY6lBpiEVFiGUjGRR+61R67Lz6U4KJeLNcCm07QwFYKBmpi08g
|
||||||
const listClaimMappings = {
|
const listClaimMappings = {
|
||||||
"http://example.com/example-1": `${fake.hacker.noun()}`
|
"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 = {};
|
let config = {};
|
||||||
switch(type) {
|
switch(type) {
|
||||||
|
@ -91,6 +105,7 @@ SmTjcs+lhMxg4fFY6lBpiEVFiGUjGRR+61R67Lz6U4KJeLNcCm07QwFYKBmpi08g
|
||||||
"DisplayName": "${fake.hacker.noun()}",
|
"DisplayName": "${fake.hacker.noun()}",
|
||||||
"MaxTokenTTL": "${fake.random.number({min: 0, max: 60})}m${fake.random.number({min: 0, max: 60})}s",
|
"MaxTokenTTL": "${fake.random.number({min: 0, max: 60})}m${fake.random.number({min: 0, max: 60})}s",
|
||||||
"TokenLocality": "${fake.helpers.randomize(['local', 'global', ''])}",
|
"TokenLocality": "${fake.helpers.randomize(['local', 'global', ''])}",
|
||||||
|
"NamespaceRules": ${namespaceRules},
|
||||||
"Config": ${JSON.stringify(config)},
|
"Config": ${JSON.stringify(config)},
|
||||||
"CreateIndex": ${fake.random.number()},
|
"CreateIndex": ${fake.random.number()},
|
||||||
"ModifyIndex": 10
|
"ModifyIndex": 10
|
||||||
|
|
|
@ -192,6 +192,8 @@ models:
|
||||||
TokenLocality: Token locality
|
TokenLocality: Token locality
|
||||||
Type: Type
|
Type: Type
|
||||||
MaxTokenTTL: Maximum token TTL
|
MaxTokenTTL: Maximum token TTL
|
||||||
|
Selector: Selector
|
||||||
|
BindNamespace: Bind Namespace
|
||||||
Config:
|
Config:
|
||||||
Host: Host
|
Host: Host
|
||||||
CACert: CA Cert
|
CACert: CA Cert
|
||||||
|
|
Loading…
Reference in New Issue