mirror of https://github.com/rancher/ui.git
Merge pull request #2352 from westlywright/issue-15554
Add private registry to cluster create
This commit is contained in:
commit
4941a93f36
|
|
@ -1,5 +1,75 @@
|
|||
{{#if (or isEdit (eq step 1))}}
|
||||
{{#accordion-list showExpandAll=false as |al expandFn|}}
|
||||
{{#unless pasteOrUpload}}
|
||||
{{#accordion-list-item
|
||||
title=(t 'clusterNew.rke.network.title')
|
||||
detail=(t 'clusterNew.rke.network.detail')
|
||||
expandOnInit=(eq mode "edit" true false)
|
||||
expandAll=al.expandAll
|
||||
expand=(action expandFn)
|
||||
}}
|
||||
<div class="row">
|
||||
<div class="col span-4">
|
||||
<label class="acc-label">{{t 'clusterNew.rke.network.label'}}</label>
|
||||
{{new-select
|
||||
classNames="form-control"
|
||||
content=networkContent
|
||||
localizedLabel=true
|
||||
value=cluster.rancherKubernetesEngineConfig.network.plugin
|
||||
disabled=isEdit
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col span-4">
|
||||
<label class="acc-label">{{t 'clusterNew.rke.networkPolicy.label'}}</label>
|
||||
<div class="radio">
|
||||
<label class={{unless (eq cluster.rancherKubernetesEngineConfig.network.plugin "canal") 'text-muted'}}>
|
||||
{{radio-button selection=cluster.enableNetworkPolicy value=true disabled=(not-eq cluster.rancherKubernetesEngineConfig.network.plugin "canal")}}
|
||||
{{t 'generic.enabled'}}
|
||||
</label>
|
||||
</div>
|
||||
<div class="radio">
|
||||
<label class={{unless (eq cluster.rancherKubernetesEngineConfig.network.plugin "canal") 'text-muted'}}>
|
||||
{{radio-button selection=cluster.enableNetworkPolicy value=false disabled=(not-eq cluster.rancherKubernetesEngineConfig.network.plugin "canal")}}
|
||||
{{t 'generic.disabled'}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col span-4">
|
||||
<label class="acc-label">{{t 'clusterNew.rke.ingress.label'}}</label>
|
||||
<div class="radio">
|
||||
<label>
|
||||
{{!--
|
||||
{{radio-button selection=nginxIngressProvider value="nginx"}}
|
||||
--}}
|
||||
{{radio-button selection=cluster.rancherKubernetesEngineConfig.ingress.provider value="nginx"}}
|
||||
{{t 'generic.enabled'}}
|
||||
</label>
|
||||
</div>
|
||||
<div class="radio">
|
||||
<label>
|
||||
{{!--
|
||||
{{radio-button selection=nginxIngressProvider value=null}}
|
||||
--}}
|
||||
{{radio-button selection=cluster.rancherKubernetesEngineConfig.ingress.provider value="none"}}
|
||||
{{t 'generic.disabled'}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col span-4">
|
||||
<label class="acc-label">{{t 'clusterNew.rke.serviceNodePortRange.label'}}</label>
|
||||
{{input
|
||||
type="text"
|
||||
value=cluster.rancherKubernetesEngineConfig.services.kubeApi.serviceNodePortRange
|
||||
className="form-control"
|
||||
placeholder=(t 'clusterNew.rke.serviceNodePortRange.placeholder')
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
{{/accordion-list-item}}
|
||||
{{/unless}}
|
||||
|
||||
{{#accordion-list-item
|
||||
title=(t 'clusterNew.rke.customize.label')
|
||||
detail=(t 'clusterNew.rke.customize.detail')
|
||||
|
|
@ -43,54 +113,8 @@
|
|||
value=cluster.rancherKubernetesEngineConfig.kubernetesVersion
|
||||
}}
|
||||
</div>
|
||||
<div class="col span-4">
|
||||
<label class="acc-label">{{t 'clusterNew.rke.network.label'}}</label>
|
||||
{{new-select
|
||||
classNames="form-control"
|
||||
content=networkContent
|
||||
localizedLabel=true
|
||||
value=cluster.rancherKubernetesEngineConfig.network.plugin
|
||||
disabled=isEdit
|
||||
}}
|
||||
</div>
|
||||
<div class="col span-4">
|
||||
<label class="acc-label">{{t 'clusterNew.rke.networkPolicy.label'}}</label>
|
||||
<div class="radio">
|
||||
<label class={{unless (eq cluster.rancherKubernetesEngineConfig.network.plugin "canal") 'text-muted'}}>
|
||||
{{radio-button selection=cluster.enableNetworkPolicy value=true disabled=(not-eq cluster.rancherKubernetesEngineConfig.network.plugin "canal")}}
|
||||
{{t 'generic.enabled'}}
|
||||
</label>
|
||||
</div>
|
||||
<div class="radio">
|
||||
<label class={{unless (eq cluster.rancherKubernetesEngineConfig.network.plugin "canal") 'text-muted'}}>
|
||||
{{radio-button selection=cluster.enableNetworkPolicy value=false disabled=(not-eq cluster.rancherKubernetesEngineConfig.network.plugin "canal")}}
|
||||
{{t 'generic.disabled'}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col span-4">
|
||||
<label class="acc-label">{{t 'clusterNew.rke.ingress.label'}}</label>
|
||||
<div class="radio">
|
||||
<label>
|
||||
{{!--
|
||||
{{radio-button selection=nginxIngressProvider value="nginx"}}
|
||||
--}}
|
||||
{{radio-button selection=cluster.rancherKubernetesEngineConfig.ingress.provider value="nginx"}}
|
||||
{{t 'generic.enabled'}}
|
||||
</label>
|
||||
</div>
|
||||
<div class="radio">
|
||||
<label>
|
||||
{{!--
|
||||
{{radio-button selection=nginxIngressProvider value=null}}
|
||||
--}}
|
||||
{{radio-button selection=cluster.rancherKubernetesEngineConfig.ingress.provider value="none"}}
|
||||
{{t 'generic.disabled'}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col span-4">
|
||||
<label class="acc-label">{{t 'clusterNew.rke.monitoring.label'}}</label>
|
||||
<div class="radio">
|
||||
|
|
@ -136,6 +160,23 @@
|
|||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col span-4">
|
||||
{{#if cluster.rancherKubernetesEngineConfig.services.kubeApi.podSecurityPolicy}}
|
||||
<label class="acc-label">{{t 'clusterNew.psp.label'}}{{field-required}}</label>
|
||||
{{new-select
|
||||
content=model.psps
|
||||
optionLabelPath='displayName'
|
||||
optionValuePath='id'
|
||||
prompt='clusterNew.psp.prompt'
|
||||
localizedPrompt=true
|
||||
value=cluster.defaultPodSecurityPolicyTemplateId
|
||||
disabled=(not cluster.rancherKubernetesEngineConfig.services.kubeApi.podSecurityPolicy)
|
||||
}}
|
||||
{{else}}
|
||||
<label class="acc-label">{{t 'clusterNew.psp.label'}}</label>
|
||||
<div class="form-control-static">{{t 'generic.none'}}</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col span-4">
|
||||
|
|
@ -164,34 +205,8 @@
|
|||
}}
|
||||
</div>
|
||||
|
||||
<div class="col span-4">
|
||||
{{#if cluster.rancherKubernetesEngineConfig.services.kubeApi.podSecurityPolicy}}
|
||||
<label class="acc-label">{{t 'clusterNew.psp.label'}}{{field-required}}</label>
|
||||
{{new-select
|
||||
content=model.psps
|
||||
optionLabelPath='displayName'
|
||||
optionValuePath='id'
|
||||
prompt='clusterNew.psp.prompt'
|
||||
localizedPrompt=true
|
||||
value=cluster.defaultPodSecurityPolicyTemplateId
|
||||
disabled=(not cluster.rancherKubernetesEngineConfig.services.kubeApi.podSecurityPolicy)
|
||||
}}
|
||||
{{else}}
|
||||
<label class="acc-label">{{t 'clusterNew.psp.label'}}</label>
|
||||
<div class="form-control-static">{{t 'generic.none'}}</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col span-4">
|
||||
<label class="acc-label">{{t 'clusterNew.rke.serviceNodePortRange.label'}}</label>
|
||||
{{input
|
||||
type="text"
|
||||
value=cluster.rancherKubernetesEngineConfig.services.kubeApi.serviceNodePortRange
|
||||
className="form-control"
|
||||
placeholder=(t 'clusterNew.rke.serviceNodePortRange.placeholder')
|
||||
}}
|
||||
</div>
|
||||
{{#if (and (eq nodeWhich 'custom') (eq mode 'new'))}}
|
||||
<div class="col span-4">
|
||||
<label class="acc-label">{{t 'clusterNew.rke.windowsSupport.label'}}</label>
|
||||
|
|
@ -220,6 +235,22 @@
|
|||
</div>
|
||||
{{/if}}
|
||||
{{/accordion-list-item}}
|
||||
|
||||
{{#if isCustom }}
|
||||
{{#unless pasteOrUpload}}
|
||||
{{#accordion-list-item
|
||||
title=(t 'cruPrivateRegistry.title.label')
|
||||
detail=(t 'cruPrivateRegistry.title.detail')
|
||||
expandOnInit=(eq mode "edit" true false)
|
||||
expandAll=al.expandAll
|
||||
expand=(action expandFn)
|
||||
}}
|
||||
{{cru-private-registry
|
||||
cluster=cluster
|
||||
}}
|
||||
{{/accordion-list-item}}
|
||||
{{/unless}}
|
||||
{{/if}}
|
||||
{{/accordion-list}}
|
||||
|
||||
{{#unless isCustom}}
|
||||
|
|
@ -426,6 +457,7 @@
|
|||
|
||||
</section>
|
||||
{{/accordion-list-item}}
|
||||
|
||||
{{/accordion-list}}
|
||||
|
||||
{{#if newNodeCount}}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,88 @@
|
|||
import Component from '@ember/component';
|
||||
import layout from './template';
|
||||
import { get, set, observer } from '@ember/object';
|
||||
import { alias } from '@ember/object/computed';
|
||||
import { inject as service } from '@ember/service';
|
||||
import { on } from '@ember/object/evented';
|
||||
|
||||
|
||||
const headers = [
|
||||
{
|
||||
name: 'user',
|
||||
classNames: ['text-center'],
|
||||
translationKey: 'cruPrivateRegistry.registry.user.label',
|
||||
},
|
||||
{
|
||||
name: 'password',
|
||||
classNames: ['text-center'],
|
||||
sort: false,
|
||||
translationKey: 'cruPrivateRegistry.registry.password.label',
|
||||
},
|
||||
{
|
||||
name: 'url',
|
||||
classNames: ['text-center'],
|
||||
translationKey: 'cruPrivateRegistry.registry.url.label',
|
||||
},
|
||||
{
|
||||
name: 'default',
|
||||
classNames: ['text-center'],
|
||||
translationKey: 'cruPrivateRegistry.registry.default.label',
|
||||
width: 250,
|
||||
},
|
||||
{
|
||||
name: 'remove',
|
||||
sort: false,
|
||||
classNames: ['text-center'],
|
||||
width: 50,
|
||||
}
|
||||
];
|
||||
|
||||
export default Component.extend({
|
||||
globalStore: service(),
|
||||
|
||||
layout,
|
||||
headers,
|
||||
|
||||
configName: 'rancherKubernetesEngineConfig',
|
||||
cluster: null,
|
||||
config: null,
|
||||
editing: true,
|
||||
urlInvalid: null,
|
||||
urlWarning: null,
|
||||
urlError: null,
|
||||
|
||||
privateRegistries: alias('config.privateRegistries'),
|
||||
|
||||
init() {
|
||||
this._super(...arguments);
|
||||
|
||||
const config = set(this, 'config', get(this, `cluster.${ get(this, 'configName') }`));
|
||||
|
||||
if (( config.privateRegistries || [] ).length <= 0) {
|
||||
set(config, 'privateRegistries', [this.newPrivateRegistry()]);
|
||||
}
|
||||
},
|
||||
|
||||
actions: {
|
||||
addRegistry() {
|
||||
get(this, 'privateRegistries').pushObject(this.newPrivateRegistry());
|
||||
},
|
||||
removeRegistry(registry) {
|
||||
get(this, 'privateRegistries').removeObject(registry);
|
||||
},
|
||||
},
|
||||
|
||||
defaultSet: on('init', observer('privateRegistries.@each.{isDefault}', function() {
|
||||
const { privateRegistries } = this;
|
||||
|
||||
if (privateRegistries.findBy('isDefault', true)) {
|
||||
set(this, 'hasDefault', true);
|
||||
} else {
|
||||
set(this, 'hasDefault', false);
|
||||
}
|
||||
})),
|
||||
|
||||
newPrivateRegistry(registryType = 'privateRegistry') {
|
||||
return get(this, 'globalStore').createRecord({ type: registryType });
|
||||
}
|
||||
});
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
{{#sortable-table
|
||||
body=privateRegistries
|
||||
bulkActions=false
|
||||
classNames="grid sortable-table"
|
||||
descending=false
|
||||
headers=headers
|
||||
pagingLabel="pagination.nodePool"
|
||||
rowActions=false
|
||||
search=false
|
||||
as |sortable kind reg dt|
|
||||
}}
|
||||
{{#if (eq kind "row")}}
|
||||
<tr class="main-row">
|
||||
<td data-title="{{dt.user}}" class="text-center pr-5 pt-5">
|
||||
{{#input-or-display
|
||||
editable=editing
|
||||
value=reg.user
|
||||
}}
|
||||
{{input
|
||||
class="input-sm"
|
||||
type="text"
|
||||
value=reg.user
|
||||
}}
|
||||
{{/input-or-display}}
|
||||
</td>
|
||||
<td data-title="{{dt.password}}" class="text-center pr-5 pt-5">
|
||||
{{#input-or-display
|
||||
editable=editing
|
||||
obfuscate=true
|
||||
value=reg.password
|
||||
}}
|
||||
{{input
|
||||
class="conceal input-sm"
|
||||
type="password"
|
||||
value=reg.password
|
||||
}}
|
||||
{{/input-or-display}}
|
||||
</td>
|
||||
<td data-title="{{dt.url}}" class="text-center pr-5 pt-5">
|
||||
{{#input-or-display
|
||||
editable=editing
|
||||
value=reg.url
|
||||
}}
|
||||
{{input-url
|
||||
classNames="form-control input-sm"
|
||||
isInvalid=(action (mut urlInvalid))
|
||||
urlWarning=(action (mut urlWarning))
|
||||
urlError=(action (mut urlError))
|
||||
value=reg.url
|
||||
}}
|
||||
{{/input-or-display}}
|
||||
</td>
|
||||
<td data-title="{{dt.default}}" class="text-center">
|
||||
<label>
|
||||
{{input
|
||||
type="checkbox"
|
||||
checked=reg.isDefault
|
||||
disabled=(and (not reg.isDefault) hasDefault)
|
||||
}}
|
||||
</label>
|
||||
</td>
|
||||
<td data-title="{{dt.remove}}" class="text-center">
|
||||
<button class="btn bg-primary btn-sm" {{action "removeRegistry" reg}}><i class="icon icon-minus"/></button>
|
||||
</td>
|
||||
</tr>
|
||||
{{else if (eq kind "norows")}}
|
||||
<tr><td colspan="{{sortable.fullColspan}}" class="text-center text-muted pt-40 pb-40">{{t 'cruPrivateRegistry.noData'}}</td></tr>
|
||||
{{/if}}
|
||||
{{/sortable-table}}
|
||||
|
||||
<button class="btn bg-primary mt-20" {{action "addRegistry"}}><i class="icon icon-plus"/><span class="ml-10">{{t 'cruPrivateRegistry.add.label'}}</span></button>
|
||||
|
|
@ -0,0 +1 @@
|
|||
export { default } from 'shared/components/cru-private-registry/component';
|
||||
|
|
@ -927,6 +927,23 @@ cruPersistentVolumeClaim:
|
|||
label: Storage Class
|
||||
prompt: Use the default class
|
||||
|
||||
cruPrivateRegistry:
|
||||
title:
|
||||
label: Private Registries
|
||||
detail: Add private registries to this cluster
|
||||
noData: This cluster does not have any private registries defined
|
||||
add:
|
||||
label: Add Private Registry
|
||||
registry:
|
||||
user:
|
||||
label: User
|
||||
password:
|
||||
label: Password
|
||||
url:
|
||||
label: URL
|
||||
default:
|
||||
label: Default Registry
|
||||
|
||||
cruVolume:
|
||||
sourcePrompt: Choose a Volume Source above...
|
||||
title:
|
||||
|
|
@ -2108,6 +2125,8 @@ clusterNew:
|
|||
label: Node Port Range
|
||||
placeholder: e.g. 30000-32767
|
||||
network:
|
||||
title: Networking
|
||||
detail: Configure the networking for the cluster
|
||||
label: Network Provider
|
||||
flannel: Flannel
|
||||
calico: Calico
|
||||
|
|
|
|||
Loading…
Reference in New Issue