Merge pull request #2352 from westlywright/issue-15554

Add private registry to cluster create
This commit is contained in:
Westly Wright 2018-10-23 09:41:54 -07:00 committed by GitHub
commit 4941a93f36
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 283 additions and 72 deletions

View File

@ -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}}

View File

@ -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 });
}
});

View File

@ -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>

View File

@ -0,0 +1 @@
export { default } from 'shared/components/cru-private-registry/component';

View File

@ -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