Skip to content

Commit 0c47205

Browse files
committed
Merge branch 'ingress-pull-secret-credentials' into 'main'
Ingress pull secret credentials See merge request weblogic-cloud/weblogic-toolkit-ui!446
2 parents 514940b + 5bc68a8 commit 0c47205

File tree

7 files changed

+88
-42
lines changed

7 files changed

+88
-42
lines changed

electron/app/locales/en/webui.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -912,17 +912,16 @@
912912
"ingress-design-nginx-allow-passthrough-help": "Enable this allows creating SSL pass through ingress transport to the target service.",
913913
"ingress-design-specify-docker-registry-secret-label": "Use Docker Hub Secret",
914914
"ingress-design-specify-docker-registry-secret-help": "Whether to use a Docker Hub credential secret to pull the ingress controller image. This is helpful if you encounter a Docker Hub pull limit exceeded error.",
915-
"ingress-design-ingress-docker-reg-secret-name": "Docker Registry Secret Name",
915+
"ingress-design-ingress-docker-reg-secret-name": "Docker Hub Registry Secret Name",
916916
"ingress-design-ingress-docker-reg-secret-name-help": "The Kubernetes secret name to use when pulling images from Docker Hub. Note that the secret must exist in the same namespace as the ingress controller.",
917917
"ingress-design-create-docker-registry-secret-label": "Create Docker Hub Secret",
918918
"ingress-design-create-docker-registry-secret-help": "Whether to create a new Docker Hub credential secret or use an existing secret.",
919-
"ingress-design-ingress-docker-reg-secret-userid": "Docker Hub Username",
920-
"ingress-design-ingress-docker-reg-secret-userid-help": "The user name used to log in to Docker Hub.",
921-
"ingress-design-ingress-docker-reg-secret-userpwd": "Docker Hub User Password",
922-
"ingress-design-ingress-docker-reg-secret-userpwd-help": "The password used to log in to Docker Hub.",
923-
"ingress-design-ingress-docker-reg-secret-useremail": "Docker Hub Email Address",
924-
"ingress-design-ingress-docker-reg-secret-useremail-help": "The email address of the user logging in to Docker Hub.",
919+
"ingress-design-ingress-image-registry-pull-credentials-label": "Docker Hub Image Registry Pull Credentials",
920+
"ingress-design-ingress-image-registry-pull-credentials-help": "The Image Registry Credential to use to log in to Docker Hub.",
921+
"ingress-design-image-registry-add-credentials": "Add Image Registry Credentials",
925922
"ingress-design-route-get-services-title": "Getting services for namespace {{namespace}}",
923+
"ingress-design-image-registry-pull-credentials-label": "Docker Hub Image Registry Pull Credentials",
924+
"ingress-design-image-registry-pull-credentials-help": "The image registry credentials to use to pull the ingress controller image from Docker Hub",
926925

927926
"ingress-design-ingress-routes-title": "Ingress Routes Configuration",
928927
"ingress-design-ingress-route-virtualhost-label": "Virtual Host",
@@ -1019,6 +1018,7 @@
10191018
"ingress-installer-install-failed-title": "Ingress Controller Installation Failed",
10201019
"ingress-installer-install-failed-error-message":"Installing ingress controller {{name}} to Kubernetes namespace {{namespace}} failed: {{error}}.",
10211020
"ingress-installer-install-catch-all-error-message": "Ingress Controller installation failed with an unexpected error: {{error}}.",
1021+
"ingress-installer-create-image-pull-secret-error-message": "Unable to install ingress controller in Kubernetes due to an error creating the image pull secret {{secretName}} in the Kubernetes namespace {{namespace}}: {{error}}",
10221022

10231023
"ingress-uninstaller-aborted-error-title": "Ingress Controller Uninstall Aborted",
10241024
"ingress-uninstaller-not-install-message": "The Install Ingress Controller option is off so there is nothing to do.",

webui/src/js/models/ingress-definition.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,7 @@ define(['knockout', 'utils/observable-properties', 'utils/validation-helper'],
3131
this.dockerRegSecretName = props.createProperty('dockerhub');
3232
this.dockerRegSecretName.addValidator(...validationHelper.getK8sNameValidators());
3333

34-
this.dockerRegSecretUserId = props.createProperty('').asCredential();
35-
this.dockerRegSecretUserPwd = props.createProperty('').asCredential();
36-
this.dockerRegSecretUserEmail = props.createProperty('');
37-
this.dockerRegSecretUserEmail.addValidator(...validationHelper.getEmailAddressValidators());
34+
this.dockerRegImageCredentialReference = props.createProperty('');
3835

3936
this.createDockerRegSecret = props.createProperty(false);
4037
this.specifyDockerRegSecret = props.createProperty(false);

webui/src/js/models/wkt-project.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,14 @@ function (ko, wdtConstructor, imageConstructor, kubectlConstructor, domainConstr
256256
'auxImageRegistryPullCredentialsReference', 'auxImageTag',
257257
'image', 'auxImageRegistryPullEmail');
258258
}
259+
if ('ingress' in wktProjectJson) {
260+
// This use case is using the default traefik image from Docker Hub so no need for an address...
261+
//
262+
this._processNewPayloadEntry(containerImageRegistriesCredentials, wktProjectJson, 'ingress',
263+
'dockerRegSecretUserId', 'dockerRegSecretUserPwd',
264+
'dockerRegImageCredentialReference', undefined, undefined,
265+
'dockerRegSecretUserEmail');
266+
}
259267

260268
// If there are any new entries, add the section to the project settings JSON.
261269
if (Object.keys(containerImageRegistriesCredentials).length > 0) {
@@ -265,6 +273,21 @@ function (ko, wdtConstructor, imageConstructor, kubectlConstructor, domainConstr
265273
wktProjectJson['settings']['containerImageRegistriesCredentials'] = containerImageRegistriesCredentials;
266274
}
267275

276+
// delete old email address fields for pull secrets
277+
//
278+
if ('k8sDomain' in wktProjectJson) {
279+
if ('imageRegistryPullEmail' in wktProjectJson['k8sDomain']) {
280+
delete wktProjectJson['k8sDomain']['imageRegistryPullEmail'];
281+
}
282+
if ('auxImageRegistryPullEmail' in wktProjectJson['k8sDomain']) {
283+
delete wktProjectJson['k8sDomain']['auxImageRegistryPullEmail'];
284+
}
285+
}
286+
if ('ingress' in wktProjectJson) {
287+
if ('dockerRegSecretUserEmail' in wktProjectJson['ingress']) {
288+
delete wktProjectJson['ingress']['dockerRegSecretUserEmail'];
289+
}
290+
}
268291

269292
// Now, update the credentialPaths array to remove references to the old fields.
270293
// The new fields will be added during save...
@@ -313,6 +336,11 @@ function (ko, wdtConstructor, imageConstructor, kubectlConstructor, domainConstr
313336
case 'k8sDomain.auxImageRegistryPullPassword':
314337
pathsToDelete.push('k8sDomain.auxImageRegistryPullPassword');
315338
break;
339+
case 'ingress.dockerRegSecretUserId':
340+
pathsToDelete.push('ingress.dockerRegSecretUserId');
341+
break;
342+
case 'ingress.dockerRegSecretUserPwd':
343+
pathsToDelete.push('ingress.dockerRegSecretUserPwd');
316344
}
317345
}
318346
if (pathsToDelete.length > 0) {

webui/src/js/utils/ingress-controller-installer.js

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,13 @@ function(IngressActionsBase, project, wktConsole, k8sHelper, i18n, dialogHelper,
136136
if (ingressControllerProvider === 'traefik' || ingressControllerProvider === 'voyager' ) {
137137
// create image pull secret for pulling Traefik or Voyager images.
138138
if (this.project.ingress.createDockerRegSecret.value === true && secretName) {
139+
const credentials =
140+
this.getImageRegistryCredential(this.project.ingress.dockerRegImageCredentialReference.value);
139141
const secretData = {
140-
server: 'docker.io',
141-
username: this.project.ingress.dockerRegSecretUserId.value,
142-
email: this.project.ingress.dockerRegSecretUserEmail.value,
143-
password: this.project.ingress.dockerRegSecretUserPwd.value
142+
server: credentials.address || 'docker.io',
143+
username: credentials.username,
144+
email: credentials.email,
145+
password: credentials.password
144146
};
145147
const secretStatus = await this.createPullSecret(kubectlExe, kubectlOptions, ingressControllerNamespace,
146148
secretName, secretData, errTitle, errPrefix);
@@ -218,12 +220,22 @@ function(IngressActionsBase, project, wktConsole, k8sHelper, i18n, dialogHelper,
218220
this.project.ingress.dockerRegSecretName.validate(true), ingressFormConfig);
219221

220222
if (this.project.ingress.createDockerRegSecret.value === true) {
221-
validationObject.addField('ingress-design-ingress-docker-reg-secret-useremail',
222-
this.project.ingress.dockerRegSecretUserEmail.validate(true), ingressFormConfig);
223-
validationObject.addField('ingress-design-ingress-docker-reg-secret-userid',
224-
validationHelper.validateRequiredField(this.project.ingress.dockerRegSecretUserId.value), ingressFormConfig);
225-
validationObject.addField('ingress-design-ingress-docker-reg-secret-userpwd',
226-
validationHelper.validateRequiredField(this.project.ingress.dockerRegSecretUserPwd.value), ingressFormConfig);
223+
validationObject.addField('ingress-design-image-registry-pull-credentials-label',
224+
validationHelper.validateRequiredField(this.project.ingress.dockerRegImageCredentialReference.value),
225+
ingressFormConfig);
226+
227+
const credentials =
228+
this.getImageRegistryCredential(this.project.ingress.dockerRegImageCredentialReference.value);
229+
if (credentials) {
230+
const projectSettingsFormConfig = validationObject.getDefaultConfigObject();
231+
projectSettingsFormConfig.formName = 'project-settings-form-name';
232+
validationObject.addField('project-settings-container-image-registries-credentials-email-heading',
233+
validationHelper.validateRequiredField(credentials.email), projectSettingsFormConfig);
234+
validationObject.addField('project-settings-container-image-registries-credentials-username-heading',
235+
validationHelper.validateRequiredField(credentials.username), projectSettingsFormConfig);
236+
validationObject.addField('project-settings-container-image-registries-credentials-password-heading',
237+
validationHelper.validateRequiredField(credentials.password), projectSettingsFormConfig);
238+
}
227239
}
228240
}
229241
}

webui/src/js/utils/ingress-install-script-generator.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,11 @@ define(['models/wkt-project', 'utils/script-generator-base', 'utils/helm-helper'
5959
this.adapter.addVariableDefinition('DOCKER_HUB_SECRET_NAME', this.project.ingress.dockerRegSecretName.value);
6060
this.adapter.addVariableDefinition('DOCKER_HUB_USER', this.credentialMask);
6161
this.adapter.addVariableDefinition('DOCKER_HUB_PASS', this.credentialMask);
62-
this.adapter.addVariableDefinition('DOCKER_HUB_EMAIL', this.project.ingress.dockerRegSecretUserEmail.value);
62+
const dockerRegImageCredentialReference =
63+
this.getImageRegistryCredential(this.project.ingress.dockerRegImageCredentialReference.value);
64+
const email =
65+
!!dockerRegImageCredentialReference ? (dockerRegImageCredentialReference.email || '') : '';
66+
this.adapter.addVariableDefinition('DOCKER_HUB_EMAIL', email);
6367
this.adapter.addEmptyLine();
6468

6569
comment = [ 'If not using an external load balancer, the ingress controller service type to use (e.g., NodePort)' ];

webui/src/js/viewModels/ingress-design-view-impl.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ function(i18n, accUtils, ko, ArrayDataProvider, BufferingDataProvider, project,
3434
return i18n.t(key);
3535
};
3636

37+
this.imageLabelMapper = (labelId, payload) => {
38+
return i18n.t(`image-design-${labelId}`, payload);
39+
};
40+
3741
this.anyLabelMapper = (labelId, arg) => {
3842
return i18n.t(labelId, arg);
3943
};
@@ -64,6 +68,12 @@ function(i18n, accUtils, ko, ArrayDataProvider, BufferingDataProvider, project,
6468
return project.ingress.specifyDockerRegSecret.value && project.ingress.createDockerRegSecret.value;
6569
};
6670

71+
this.imageRegistriesCredentialsDP = new BufferingDataProvider(new ArrayDataProvider(
72+
this.project.settings.containerImageRegistriesCredentials.observable, { keyAttributes: 'uid' }));
73+
this.getImageRegistriesCredentialsItemText = (itemContext) => {
74+
return itemContext.data.name;
75+
};
76+
6777
this.voyagerProviders = [
6878
{key: 'OKE', label: this.anyLabelMapper('kubectl-list-okeTitle')},
6979
{key: 'AKS', label: this.anyLabelMapper('kubectl-list-aksTitle')},
@@ -263,6 +273,10 @@ function(i18n, accUtils, ko, ArrayDataProvider, BufferingDataProvider, project,
263273
this.getEnabledText = (value) => {
264274
return this.anyLabelMapper(value ? 'dialog-button-yes' : 'dialog-button-no');
265275
};
276+
277+
this.editImageRegistryCredentials = () => {
278+
dialogHelper.openDialog('registry-credentials-dialog', {});
279+
};
266280
}
267281

268282
/*

webui/src/js/views/ingress-design-view.html

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -82,26 +82,17 @@ <h6 class="wkt-subheading">
8282
</oj-bind-if>
8383
<div>
8484
<oj-bind-if test="[[createDockerHubSecret() === true]]">
85-
<oj-input-text label-hint="[[labelMapper('ingress-docker-reg-secret-useremail')]]"
86-
value="{{project.ingress.dockerRegSecretUserEmail.observable}}"
87-
help.instruction="[[labelMapper('ingress-docker-reg-secret-useremail-help')]]">
88-
</oj-input-text>
89-
</oj-bind-if>
90-
91-
<oj-bind-if test="[[createDockerHubSecret() === true]]">
92-
<oj-input-password label-hint="[[labelMapper('ingress-docker-reg-secret-userid')]]"
93-
value="{{project.ingress.dockerRegSecretUserId.observable}}"
94-
mask-icon="visible"
95-
help.instruction="[[labelMapper('ingress-docker-reg-secret-userid-help')]]">
96-
</oj-input-password>
97-
</oj-bind-if>
98-
99-
<oj-bind-if test="[[createDockerHubSecret() === true]]">
100-
<oj-input-password label-hint="[[labelMapper('ingress-docker-reg-secret-userpwd')]]"
101-
value="{{project.ingress.dockerRegSecretUserPwd.observable}}"
102-
mask-icon="visible"
103-
help.instruction="[[labelMapper('ingress-docker-reg-secret-userpwd-help')]]">
104-
</oj-input-password>
85+
<oj-select-single label-hint="[[labelMapper('image-registry-pull-credentials-label')]]"
86+
value="{{project.ingress.dockerRegImageCredentialReference.observable}}"
87+
data="[[imageRegistriesCredentialsDP]]"
88+
item-text="[[getImageRegistriesCredentialsItemText]]"
89+
help.instruction="[[labelMapper('image-registry-pull-credentials-help')]]">
90+
</oj-select-single>
91+
<oj-button class="wkt-button-below"
92+
label="[[imageLabelMapper('image-registry-add-credentials')]]"
93+
chroming="callToAction"
94+
on-oj-action="[[editImageRegistryCredentials]]">
95+
</oj-button>
10596
</oj-bind-if>
10697
</div>
10798
</oj-form-layout>

0 commit comments

Comments
 (0)