Skip to content

Commit 63808a8

Browse files
authored
Fix existing ingress object detection (#91)
1 parent 568c418 commit 63808a8

File tree

6 files changed

+77
-10
lines changed

6 files changed

+77
-10
lines changed

electron/app/js/ipcRendererPreload.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ contextBridge.exposeInMainWorld(
174174
'k8s-apply',
175175
'k8s-label-namespace',
176176
'k8s-get-service-details',
177+
'k8s-get-ingresses',
177178
'k8s-get-operator-version-from-domain-config-map',
178179
'k8s-get-k8s-config',
179180
'k8s-get-k8s-cluster-info',

electron/app/js/kubectlUtils.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,30 @@ async function getServiceDetails(kubectlExe, namespace, serviceName, options) {
565565
});
566566
}
567567

568+
async function getIngresses(kubectlExe, namespace, serviceType, options) {
569+
const getArgs = [ 'get', serviceType ];
570+
getArgs.push('-n', namespace, '--output=json');
571+
const httpsProxyUrl = getHttpsProxyUrl();
572+
const bypassProxyHosts = getBypassProxyHosts();
573+
574+
const env = getKubectlEnvironment(options, httpsProxyUrl, bypassProxyHosts);
575+
const results = {
576+
isSuccess: true
577+
};
578+
579+
return new Promise(resolve => {
580+
executeFileCommand(kubectlExe, getArgs, env).then((serviceDetailsJson) => {
581+
results.serviceDetails = JSON.parse(serviceDetailsJson);
582+
resolve(results);
583+
}).catch(err => {
584+
results.isSuccess = false;
585+
results.reason = i18n.t('kubectl-get-ingresses-error-message',
586+
{namespace: namespace, error: getErrorMessage(err), type: serviceType });
587+
resolve(results);
588+
});
589+
});
590+
}
591+
568592
async function apply(kubectlExe, fileData, options) {
569593
const httpsProxyUrl = getHttpsProxyUrl();
570594
const bypassProxyHosts = getBypassProxyHosts();
@@ -777,6 +801,7 @@ module.exports = {
777801
validateKubectlExe,
778802
deleteObjectIfExists,
779803
getServiceDetails,
804+
getIngresses,
780805
getK8sConfigView,
781806
getK8sClusterInfo,
782807
getWkoDomainStatus,

electron/app/locales/en/electron.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@
282282
"kubectl-label-ns-failed-error-message": "Unable to add label {{label}} to Kubernetes namespace {{namespace}} due to an error: {{error}}",
283283
"kubectl-delete-object-failed-error-message": "Failed to delete {{object}} in {{namespace}}, reason: {{error}}",
284284
"kubectl-get-service-details-error-message": "Unable to get service details in Kubernetes namespace {{namespace}}: {{error}}",
285+
"kubectl-get-ingresses-error-message": "Unable to get {{type}} details in Kubernetes namespace {{namespace}}: {{error}}",
285286
"kubectl-config-view-error-message": "Unable to get the Kubernetes config view: {{error}}",
286287
"kubectl-cluster-info-error-message": "Unable to get the Kubernetes cluster info: {{error}}",
287288
"kubectl-get-wko-domain-status-error-message": "Unable to get Kubernetes wko domain status: {{error}}",

electron/app/locales/en/webui.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -770,6 +770,7 @@
770770
"ingress-routes-updater-already-exists-title": "Update Existing Ingress Routes",
771771
"ingress-routes-updater-routes-prompt-question": "The following routes `{{routes}}` already exist in the Kubernetes cluster, are you sure you want to overwrite them?",
772772
"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}}.",
773+
"ingress-routes-updater-get-ingresses-error-message": "Unable to getting ingress details in Kubernetes namespace {{namespace}}: {{error}}.",
773774
"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}}.",
774775
"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.",
775776
"ingress-routes-updater-check-route-target-service-in-progress": "Validating target services and ports for routes",

electron/app/main.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -813,6 +813,10 @@ class Main {
813813
return kubectlUtils.getServiceDetails(kubectlExe, ingressNamespace, serviceName, options);
814814
});
815815

816+
ipcMain.handle('k8s-get-ingresses', async (event, kubectlExe, namespace, serviceType, options) => {
817+
return kubectlUtils.getIngresses(kubectlExe, namespace, serviceType, options);
818+
});
819+
816820
ipcMain.handle('k8s-get-k8s-config', async (event, kubectlExe, options) => {
817821
return kubectlUtils.getK8sConfigView(kubectlExe, options);
818822
});

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

Lines changed: 45 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,8 @@ function(IngressActionsBase, project, wktConsole, k8sHelper, i18n, projectIo, di
154154
let k8sClusterAddress;
155155
try {
156156
k8sClusterAddress = await this._getK8sClusterAddress(kubectlExe, kubectlOptions);
157-
overlappingRoutes = await this.getOverlappingRoutes(kubectlExe, kubectlOptions, k8sClusterAddress,
158-
ingressControllerProvider, ingressControllerNamespace, routes);
157+
overlappingRoutes = await this.getOverlappingRoutes(kubectlExe, kubectlOptions,
158+
ingressControllerProvider, this.project.k8sDomain.kubernetesNamespace.value, routes);
159159
} catch (err) {
160160
dialogHelper.closeBusyDialog();
161161
await window.api.ipc.invoke('show-error-message', errTitle, err.message);
@@ -366,18 +366,29 @@ function(IngressActionsBase, project, wktConsole, k8sHelper, i18n, projectIo, di
366366
return Promise.resolve(true);
367367
}
368368

369-
async getOverlappingRoutes(kubectlExe, kubectlOptions, k8sClusterAddress, provider, namespace, routes) {
369+
async getOverlappingRoutes(kubectlExe, kubectlOptions, provider, namespace, routes) {
370370
try {
371371
let existingRouteList = [];
372+
const results =
373+
await this.getIngresses(kubectlExe, provider, namespace, kubectlOptions);
374+
if (!results.isSuccess) {
375+
const errMessage = i18n.t('ingress-routes-updater-get-ingresses-error-message',
376+
{ namespace: namespace, error: results.reason});
377+
throw new Error(errMessage);
378+
}
372379
for (const route of routes) {
373-
const serviceDetail =
374-
await this.getIngressServiceDetails(kubectlExe, provider, namespace, route, k8sClusterAddress, kubectlOptions);
375-
if (!serviceDetail.isSuccess) {
376-
const errMessage = i18n.t('ingress-routes-updater-get-service-details-error-message',
377-
{ namespace: this.project.ingress.ingressControllerNamespace.value, error: serviceDetail.reason });
378-
throw new Error(errMessage);
380+
results.serviceDetails.items.map( item => {
381+
if (item.metadata.name === route['name']) {
382+
existingRouteList.push(route['name']);
383+
}
384+
});
385+
if (results.serviceTCPDetails) {
386+
results.serviceTCPDetails.items.map( item => {
387+
if (item.metadata.name === route['name']) {
388+
existingRouteList.push(route['name']);
389+
}
390+
});
379391
}
380-
existingRouteList.push(route['name']);
381392
}
382393
return Promise.resolve(existingRouteList.length > 0 ? existingRouteList : false);
383394
} catch (err) {
@@ -514,6 +525,30 @@ function(IngressActionsBase, project, wktConsole, k8sHelper, i18n, projectIo, di
514525
return Promise.resolve(results);
515526
}
516527

528+
async getIngresses(kubectlExe, ingressControllerProvider, namespace, kubectlOptions) {
529+
let serviceType = 'Ingress';
530+
if (ingressControllerProvider === 'traefik') {
531+
serviceType = 'IngressRoute';
532+
}
533+
534+
const results = await window.api.ipc.invoke('k8s-get-ingresses',
535+
kubectlExe, namespace, serviceType, kubectlOptions);
536+
537+
if (results.isSuccess && ingressControllerProvider === 'traefik') {
538+
serviceType = 'IngressRouteTCP';
539+
const resultsTCP = await window.api.ipc.invoke('k8s-get-ingresses',
540+
kubectlExe, namespace, serviceType, kubectlOptions);
541+
if (resultsTCP.isSuccess) {
542+
results.serviceTCPDetails = resultsTCP.serviceDetails;
543+
} else {
544+
return Promise.resolve(resultsTCP);
545+
}
546+
547+
}
548+
549+
return Promise.resolve(results);
550+
}
551+
517552
async checkTargetService(kubectlExe, ingressDefinition, kubectlOptions, errTitle) {
518553
const results = await window.api.ipc.invoke('k8s-get-service-details',
519554
kubectlExe, ingressDefinition.targetServiceNameSpace, ingressDefinition.targetService, kubectlOptions);

0 commit comments

Comments
 (0)