Skip to content

Commit 10e95b0

Browse files
refactoring most calls to get service details (#97)
1 parent 24fb6d4 commit 10e95b0

File tree

5 files changed

+111
-72
lines changed

5 files changed

+111
-72
lines changed

electron/app/locales/en/webui.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -707,8 +707,8 @@
707707
"ingress-design-ingress-route-traefik-mw-label": "Traefik Middleware",
708708
"ingress-design-ingress-route-traefik-mw-help": "Customize Traefik Middlewares Object",
709709

710-
"ingress-design-ingress-routes-getting-target-service-title" : "Retrieving existing domain service details",
711-
"ingress-design-ingress-routes-getting-target-service-error-message": "Failed to get existing domain service details from Kubernetes namespace {{namespace}}: {{error}}.",
710+
"ingress-design-ingress-routes-get-services-in-namespace-title" : "Retrieving existing domain service details",
711+
"ingress-design-ingress-routes-get-services-in-namespace-error-message": "Failed to get existing domain services from Kubernetes namespace {{namespace}}: {{error}}.",
712712

713713
"ingress-design-ingress-route-name-field-validation-error": "Route {{routeName}}",
714714
"ingress-design-ingress-route-field-validation-error": "Route: {{routeName}}, Field: {{fieldName}}",
@@ -790,7 +790,7 @@
790790
"ingress-routes-updater-tls-key-invalid-error-message": "Unable to update ingress routes because the TLS Private Key File '{{file}}' does not exist.",
791791
"ingress-routes-updater-project-not-saved-error-prefix": "Unable to update ingress routes because project save failed",
792792
"ingress-routes-updater-check-ingress-service-exists": "Checking ingress controller service exists",
793-
"ingress-routes-updater-service-not-installed-error-message": "Unable to update ingress routes because the ingress controller service {{serviceName}} for ingress controller {{name}} was not found in Kubernetes namespace {{namespace}}. The ingress controller may not have been installed correctly: {{error}}.",
793+
"ingress-routes-updater-service-not-exists-error-message": "Unable to update ingress routes because the ingress controller service {{serviceName}} for ingress controller {{name}} was not found in Kubernetes namespace {{namespace}}. The ingress controller may not have been installed correctly: {{error}}.",
794794
"ingress-routes-updater-create-tls-secret-in-progress": "Creating ingress TLS secret",
795795
"ingress-routes-updater-generate-tls-files-error-message": "Unable to update ingress routes because an error occurred while generating the TLS certificate and private key files: {{error}}.",
796796
"ingress-routes-updater-create-tls-secret-error-message": "Unable to update ingress routes because an error occurred while creating the TLS secret {{name}} in Kubernetes namespace {{namespace}}: {{error}}",
@@ -800,7 +800,7 @@
800800
"ingress-routes-updater-routes-prompt-question": "The following routes `{{routes}}` already exist in the Kubernetes cluster, are you sure you want to overwrite them?",
801801
"ingress-routes-updater-get-service-details-error-message": "Unable to update ingress routes because an error occurred getting the ingress service details in Kubernetes namespace {{namespace}}: {{error}}.",
802802
"ingress-routes-updater-get-ingresses-error-message": "Unable to getting ingress details in Kubernetes namespace {{namespace}}: {{error}}.",
803-
"ingress-routes-updater-route-target-service-not-exists-error-message": "Unable to update ingress routes because the application was unable to get the details for the target service {{targetService}} specified in route {{name}}: {{error}}.",
803+
"ingress-routes-updater-target-service-not-exists-error-message": "Unable to update ingress routes because the application was unable to get the details for the target service {{serviceName}} specified in route {{name}}: {{error}}.",
804804
"ingress-routes-updater-route-target-port-not-exists-error-message": "Unable to update ingress routes because the target port {{targetPort}} specified in route {{name}} does not exists.",
805805
"ingress-routes-updater-check-route-target-service-in-progress": "Validating target services and ports for routes",
806806
"ingress-routes-updater-update-route-in-progress": "Updating ingress route {{routeName}}",

webui/src/js/utils/ingress-routes-updater.js

Lines changed: 28 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ function(IngressActionsBase, project, wktConsole, k8sHelper, i18n, projectIo, di
111111
const ingressControllerNamespace = this.project.ingress.ingressControllerNamespace.value;
112112

113113
const results = await this.doesIngressServiceExist(kubectlExe, kubectlOptions, ingressControllerProvider,
114-
ingressControllerName, ingressControllerNamespace, errTitle);
114+
ingressControllerName, ingressControllerNamespace, errTitle, errPrefix);
115115
if (!results) {
116116
return Promise.resolve(false);
117117
}
@@ -179,7 +179,7 @@ function(IngressActionsBase, project, wktConsole, k8sHelper, i18n, projectIo, di
179179
busyDialogMessage = i18n.t('ingress-routes-updater-check-route-target-service-in-progress');
180180
dialogHelper.updateBusyDialog(busyDialogMessage, 7/totalSteps);
181181
for (const route of routes) {
182-
if (! await this.checkTargetService(kubectlExe, route, kubectlOptions)) {
182+
if (! await this.checkTargetService(kubectlExe, route, kubectlOptions, errTitle, errPrefix)) {
183183
return Promise.resolve(false);
184184
}
185185
}
@@ -328,24 +328,12 @@ function(IngressActionsBase, project, wktConsole, k8sHelper, i18n, projectIo, di
328328
return Promise.resolve(true);
329329
}
330330

331-
async doesIngressServiceExist(kubectlExe, kubectlOptions, provider, name, namespace, errTitle) {
332-
try {
333-
const serviceName = provider === 'nginx' ? `${name}-ingress-nginx-controller` : name;
334-
const result = await window.api.ipc.invoke('k8s-get-service-details', kubectlExe, namespace,
335-
serviceName, kubectlOptions);
336-
if (!result.isSuccess) {
337-
const errMessage = i18n.t('ingress-routes-updater-service-not-installed-error-message', {
338-
error: result.reason,
339-
serviceName: serviceName,
340-
name: name,
341-
namespace: namespace
342-
});
343-
dialogHelper.closeBusyDialog();
344-
await window.api.ipc.invoke('show-error-message', errTitle, errMessage);
345-
return Promise.resolve(false);
346-
}
347-
} catch (err) {
348-
return Promise.reject(err);
331+
async doesIngressServiceExist(kubectlExe, kubectlOptions, provider, name, namespace, errTitle, errPrefix) {
332+
const serviceName = provider === 'nginx' ? `${name}-ingress-nginx-controller` : name;
333+
const result = await k8sHelper.getDetailsForService(kubectlExe, kubectlOptions, name, namespace, serviceName,
334+
errTitle, errPrefix);
335+
if (!result) {
336+
return Promise.resolve(false);
349337
}
350338
return Promise.resolve(true);
351339
}
@@ -412,12 +400,15 @@ function(IngressActionsBase, project, wktConsole, k8sHelper, i18n, projectIo, di
412400
return Promise.resolve(clusterAddress);
413401
}
414402

403+
// TODO - this code should be refactored to use k8sHelper's getDetailsForService()/getServiceDetailsForNamespace()
404+
// between the complexity of this code and the code calling it, I left this as is for now... --rpatrick
405+
//
415406
async getIngressServiceDetails(kubectlExe, ingressControllerProvider, ingressControllerNamespace,
416407
ingressDefinition, k8sCluster, kubectlOptions) {
417408
// serviceName == '' for Nginx and Traefik for all ingress routes created by the UI
418409
// serviceName = 'voyager-<ingress route name>' for each ingress route if it's provider is
419410
// voyagerProviderMappedValue is baremetal
420-
411+
//
421412
let serviceName = '';
422413
if (ingressControllerProvider === 'voyager') {
423414
serviceName = 'voyager-' + ingressDefinition.name;
@@ -426,8 +417,6 @@ function(IngressActionsBase, project, wktConsole, k8sHelper, i18n, projectIo, di
426417

427418
const results = await window.api.ipc.invoke('k8s-get-service-details',
428419
kubectlExe, ingressControllerNamespace, serviceName, kubectlOptions);
429-
wktLogger.debug('k8s-get-service-details for service %s returned: %s', serviceName,
430-
JSON.stringify(results, 0, null));
431420
if (results.isSuccess) {
432421
let ingressPlainPort = 80;
433422
let ingressSSLPort = 443;
@@ -549,33 +538,25 @@ function(IngressActionsBase, project, wktConsole, k8sHelper, i18n, projectIo, di
549538
return Promise.resolve(results);
550539
}
551540

552-
async checkTargetService(kubectlExe, ingressDefinition, kubectlOptions, errTitle) {
553-
const results = await window.api.ipc.invoke('k8s-get-service-details',
554-
kubectlExe, ingressDefinition.targetServiceNameSpace, ingressDefinition.targetService, kubectlOptions);
555-
556-
if (results.isSuccess) {
557-
const serviceDetail = results.serviceDetails;
558-
let found = false;
559-
serviceDetail.spec['ports'].forEach((port) => {
560-
if (Number(port.port) === Number(ingressDefinition.targetPort)) {
561-
found = true;
562-
}
563-
});
541+
async checkTargetService(kubectlExe, ingressDefinition, kubectlOptions, errTitle, errPrefix) {
542+
const results = await k8sHelper.getDetailsForService(kubectlExe, kubectlOptions, ingressDefinition.name,
543+
ingressDefinition.targetServiceNameSpace, ingressDefinition.targetService, errTitle, errPrefix);
544+
if (!results) {
545+
return Promise.resolve(false);
546+
}
564547

565-
if (!found) {
566-
const errMessage = i18n.t('ingress-routes-updater-route-target-port-not-exists-error-message', {
567-
name: ingressDefinition['name'],
568-
targetPort: ingressDefinition['targetPort']
569-
});
570-
dialogHelper.closeBusyDialog();
571-
await window.api.ipc.invoke('show-error-message', errTitle, errMessage);
572-
return Promise.resolve(false);
548+
const serviceDetail = results;
549+
let found = false;
550+
serviceDetail.spec['ports'].forEach((port) => {
551+
if (Number(port.port) === Number(ingressDefinition.targetPort)) {
552+
found = true;
573553
}
574-
} else {
575-
const errMessage = i18n.t('ingress-routes-updater-route-target-service-not-exists-error-message', {
554+
});
555+
556+
if (!found) {
557+
const errMessage = i18n.t('ingress-routes-updater-route-target-port-not-exists-error-message', {
576558
name: ingressDefinition['name'],
577-
targetService: ingressDefinition['targetService'],
578-
error:results.reason
559+
targetPort: ingressDefinition['targetPort']
579560
});
580561
dialogHelper.closeBusyDialog();
581562
await window.api.ipc.invoke('show-error-message', errTitle, errMessage);

webui/src/js/utils/wkt-actions-base.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,41 @@ function(project, wktConsole, i18n, projectIo, dialogHelper,
459459
return Promise.resolve(true);
460460
}
461461

462+
async getDetailsForService(kubectlExe, kubectlOptions, objectName, serviceNamespace, serviceName, errTitle, errPrefix,
463+
shouldCloseBusyDialog = true) {
464+
const results = await window.api.ipc.invoke('k8s-get-service-details', kubectlExe, serviceNamespace,
465+
serviceName, kubectlOptions);
466+
467+
if (!results.isSuccess) {
468+
const errMessage = i18n.t(`${errPrefix}-service-not-exists-error-message`, {
469+
name: objectName,
470+
namespace: serviceNamespace,
471+
serviceName: serviceName,
472+
error:results.reason
473+
});
474+
this._closeBusyDialog(shouldCloseBusyDialog);
475+
await window.api.ipc.invoke('show-error-message', errTitle, errMessage);
476+
return Promise.resolve(false);
477+
}
478+
return Promise.resolve(results.serviceDetails);
479+
}
480+
481+
async getServicesDetailsForNamespace(kubectlExe, kubectlOptions, serviceNamespace, errTitle, errPrefix,
482+
shouldCloseBusyDialog = true) {
483+
const results = await window.api.ipc.invoke('k8s-get-service-details', kubectlExe, serviceNamespace,
484+
'', kubectlOptions);
485+
if (!results.isSuccess) {
486+
const errMessage = i18n.t(`${errPrefix}-get-services-in-namespace-error-message`, {
487+
error: results.reason,
488+
namespace: namespace
489+
});
490+
this._closeBusyDialog(shouldCloseBusyDialog);
491+
await window.api.ipc.invoke('show-error-message', errTitle, errMessage);
492+
return Promise.resolve(false);
493+
}
494+
return Promise.resolve(results.serviceDetails);
495+
}
496+
462497
_closeBusyDialog(shouldCloseBusyDialog) {
463498
if (shouldCloseBusyDialog) {
464499
dialogHelper.closeBusyDialog();

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

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -212,23 +212,23 @@ function(i18n, accUtils, ko, ArrayDataProvider, BufferingDataProvider, project,
212212
async function getTargetServiceDetails(myProject) {
213213
const kubectlExe = k8sHelper.getKubectlExe();
214214
const kubectlOptions = k8sHelper.getKubectlOptions();
215-
const results = await window.api.ipc.invoke('k8s-get-service-details',
216-
kubectlExe, myProject.k8sDomain.kubernetesNamespace.value, '', kubectlOptions);
217-
let serviceLists = {};
218-
if (results.isSuccess) {
219-
for (const item of results.serviceDetails.items) {
220-
serviceLists[item.metadata.name] = { ports: item.spec.ports};
215+
const namespace = myProject.k8sDomain.kubernetesNamespace.value;
216+
const errTitle = i18n.t('ingress-design-ingress-routes-get-services-in-namespace-title');
217+
const errPrefix = 'ingress-design-ingress-routes';
218+
219+
dialogHelper.openBusyDialog(i18n.t('ingress-design-route-get-services-title', { namespace: namespace }));
220+
const results =
221+
await k8sHelper.getServicesDetailsForNamespace(kubectlExe, kubectlOptions, namespace, errTitle, errPrefix);
222+
if (results) {
223+
const servicesList = {};
224+
console.log('results.items is a ' + typeof(results.items));
225+
for (const item of results.items) {
226+
servicesList[item.metadata.name] = { ports: item.spec.ports };
221227
}
222-
} else {
223-
const errTitle = i18n.t('ingress-design-ingress-routes-getting-target-service-title');
224-
const errMessage = i18n.t('ingress-design-ingress-routes-getting-target-service-error-message', {
225-
error: results.reason,
226-
namespace: namespace
227-
});
228-
await window.api.ipc.invoke('show-error-message', errTitle, errMessage);
229-
return Promise.resolve(false);
228+
dialogHelper.closeBusyDialog();
229+
return Promise.resolve({ serviceList: servicesList });
230230
}
231-
return Promise.resolve( { serviceList: serviceLists});
231+
return Promise.resolve(false);
232232
}
233233

234234
this.handleEditRoute = async (event, context) => {
@@ -237,10 +237,7 @@ function(i18n, accUtils, ko, ArrayDataProvider, BufferingDataProvider, project,
237237
const index = context.item.index;
238238
let route = this.routes.observable()[index];
239239

240-
dialogHelper.openBusyDialog(this.labelMapper('route-get-services-title',
241-
{ namespace: this.project.k8sDomain.kubernetesNamespace.value }));
242240
const targetServiceDetails = await getTargetServiceDetails(this.project);
243-
dialogHelper.closeBusyDialog();
244241
if (targetServiceDetails) {
245242
const options = {route: route, serviceList: targetServiceDetails.serviceList};
246243
dialogHelper.promptDialog('route-edit-dialog', options).then(result => {

webui/src/js/viewModels/route-edit-dialog.js

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ function(accUtils, ko, i18n, project, viewHelper, ArrayDataProvider, BufferingDa
5353
let options = [];
5454
if (this.serviceList[svcName]) {
5555
for (const port of this.serviceList[svcName].ports) {
56-
options.push( { id : port.port, value: port.port, text: port.port} );
56+
options.push( { id : port.port, value: port.port, text: port.port.toString()} );
5757
}
5858
}
5959

@@ -154,7 +154,6 @@ function(accUtils, ko, i18n, project, viewHelper, ArrayDataProvider, BufferingDa
154154
});
155155

156156
this.getTargetPortPlaceholder = ko.computed(() => {
157-
console.log('targetSvcPorts is a ' + typeof(this.targetSvcPorts));
158157
const ports = this.targetSvcPorts();
159158
if (Array.isArray(ports) && ports.length > 0) {
160159
return this.labelMapper('route-targetport-placeholder');
@@ -204,8 +203,35 @@ function(accUtils, ko, i18n, project, viewHelper, ArrayDataProvider, BufferingDa
204203
};
205204

206205
this.targetSvcNameChanged = (event) => {
206+
const newServiceName = event.detail.value;
207207
this.targetSvcPorts.removeAll();
208-
this.buildTargetSvcPorts(event.detail.value).forEach(port => this.targetSvcPorts.push(port));
208+
this.buildTargetSvcPorts(newServiceName).forEach(port => this.targetSvcPorts.push(port));
209+
210+
// If the new service name is a known service and the current target port value is not
211+
// associated with the service, clear the target port selection.
212+
//
213+
let foundService = false;
214+
for (const name in this.serviceList) {
215+
if (name === newServiceName) {
216+
foundService = true;
217+
break;
218+
}
219+
}
220+
if (foundService) {
221+
const currentPortValue = this['targetPort'].observable();
222+
if (currentPortValue !== DEFAULT_ROUTE_PORT) {
223+
let foundPort = false;
224+
for (const port of this.targetSvcPorts()) {
225+
if (currentPortValue === port.text) {
226+
foundPort = true;
227+
break;
228+
}
229+
}
230+
if (!foundPort) {
231+
this['targetPort'].observable(DEFAULT_ROUTE_PORT);
232+
}
233+
}
234+
}
209235
};
210236

211237
this.okInput = () => {

0 commit comments

Comments
 (0)