diff --git a/app/kubernetes/ingress/converter.js b/app/kubernetes/ingress/converter.js index fa2e1b546..6a1dac903 100644 --- a/app/kubernetes/ingress/converter.js +++ b/app/kubernetes/ingress/converter.js @@ -89,17 +89,39 @@ export class KubernetesIngressConverter { return ingresses; } - static deleteIngressByServiceName(formValues, service) { - const ingresses = angular.copy(formValues.OriginalIngresses); - ingresses.forEach((ingress) => { - const path = _.find(ingress.Paths, { ServiceName: service.Name }); - if (path) { - _.remove(ingress.Paths, path); - } + static removeIngressesPaths(ingresses, services) { + const originalIngress = angular.copy(ingresses); + originalIngress.forEach((ingress) => { + services.forEach((service) => { + _.remove(ingress.Paths, { ServiceName: service.Name }); + }); }); - return ingresses; + return originalIngress; } + static generateNewIngresses(ingresses, services) { + const originalIngresses = angular.copy(ingresses); + services + .filter((s) => s.Ingress) + .forEach((service) => { + if (service.Ports.length !== 0) { + const matchedIngress = _.find(originalIngresses, { Name: service.Ports[0].ingress.IngressName }); + if (matchedIngress) { + const rule = new KubernetesIngressRule(); + rule.ServiceName = service.Name; + rule.IngressName = service.Ports[0].ingress.IngressName; + rule.Host = service.Ports[0].ingress.Host; + rule.Path = _.startsWith(service.Ports[0].ingress.Path, '/') ? service.Ports[0].ingress.Path : '/' + service.Ports[0].ingress.Path; + rule.Port = service.Ports[0].port; + + matchedIngress.Paths.push(rule); + } + } + }); + return originalIngresses; + } + + // need this function for [ resource summary ] controller static newApplicationFormValuesToIngresses(formValues, serviceName, servicePorts) { const ingresses = angular.copy(formValues.OriginalIngresses); servicePorts.forEach((port) => { @@ -118,27 +140,6 @@ export class KubernetesIngressConverter { return ingresses; } - static editingFormValuesToIngresses(formValues, serviceName, servicePorts) { - const ingresses = angular.copy(formValues.OriginalIngresses); - servicePorts.forEach((port) => { - const ingressMatched = _.find(ingresses, { Name: port.ingress.IngressName }); - if (ingressMatched) { - const pathMatched = _.find(ingressMatched.Paths, { ServiceName: serviceName }); - _.remove(ingressMatched.Paths, pathMatched); - - const rule = new KubernetesIngressRule(); - rule.ServiceName = serviceName; - rule.IngressName = port.ingress.IngressName; - rule.Host = port.ingress.Host; - rule.Path = _.startsWith(port.ingress.Path, '/') ? port.ingress.Path : '/' + port.ingress.Path; - rule.Port = port.port; - - ingressMatched.Paths.push(rule); - } - }); - return ingresses; - } - /** * * @param {KubernetesResourcePoolIngressClassFormValue[]} formValues diff --git a/app/kubernetes/services/applicationService.js b/app/kubernetes/services/applicationService.js index c33d96855..d2a736f58 100644 --- a/app/kubernetes/services/applicationService.js +++ b/app/kubernetes/services/applicationService.js @@ -225,12 +225,15 @@ class KubernetesApplicationService { if (services) { services.forEach(async (service) => { - this.KubernetesServiceService.create(service); - if (service.Ingress) { - const ingresses = KubernetesIngressConverter.newApplicationFormValuesToIngresses(formValues, service.Name, service.Ports); - await Promise.all(this._generateIngressPatchPromises(formValues.OriginalIngresses, ingresses)); - } + await this.KubernetesServiceService.create(service); }); + + //Generate all ingresses from current form by passing services object + const ingresses = KubernetesIngressConverter.generateNewIngresses(formValues.OriginalIngresses, services); + if (ingresses) { + //Update original ingress with current ingress + await Promise.all(this._generateIngressPatchPromises(formValues.OriginalIngresses, ingresses)); + } } if (service) { @@ -310,54 +313,54 @@ class KubernetesApplicationService { await newApiService.patch(oldApp, newApp); + // Create services if (oldServices.length === 0 && newServices.length !== 0) { newServices.forEach(async (service) => { await this.KubernetesServiceService.create(service); - if (service.Ingress) { - const ingresses = KubernetesIngressConverter.newApplicationFormValuesToIngresses(oldFormValues, service.Name, service.Ports); - await Promise.all(this._generateIngressPatchPromises(oldFormValues.OriginalIngresses, ingresses)); - } }); + + // Create multiple ingress + const ingresses = KubernetesIngressConverter.generateNewIngresses(oldFormValues.OriginalIngresses, newServices); + if (ingresses) { + await Promise.all(this._generateIngressPatchPromises(oldFormValues.OriginalIngresses, ingresses)); + } } + // Delete services ( only called when all services been deleted ) if (oldServices.length !== 0 && newServices.length === 0) { - oldServices.forEach(async (oldService) => { - if (oldService.Ingress) { - const ingresses = KubernetesIngressConverter.deleteIngressByServiceName(oldFormValues, oldService); - await Promise.all(this._generateIngressPatchPromises(oldFormValues.OriginalIngresses, ingresses)); - } - }); + const ingresses = KubernetesIngressConverter.removeIngressesPaths(oldFormValues.OriginalIngresses, oldServices); + if (ingresses) { + await Promise.all(this._generateIngressPatchPromises(oldFormValues.OriginalIngresses, ingresses)); + } await this.KubernetesServiceService.deleteAll(oldServices); } + // Patch services ( Action including: Delete, Update, Create ) if (oldServices.length !== 0 && newServices.length !== 0) { - newServices.forEach(async (newService) => { - const oldServiceMatched = _.find(oldServices, { Name: newService.Name }); - if (oldServiceMatched) { - await this.KubernetesServiceService.patch(oldServiceMatched, newService); - if (newService.Ingress) { - const ingresses = KubernetesIngressConverter.editingFormValuesToIngresses(oldFormValues, newService.Name, newService.Ports); - await Promise.all(this._generateIngressPatchPromises(oldFormValues.OriginalIngresses, ingresses)); - } - } else { - await this.KubernetesServiceService.create(newService); - if (newService.Ingress) { - const ingresses = KubernetesIngressConverter.newApplicationFormValuesToIngresses(oldFormValues, newService.Name, newService.Ports); - await Promise.all(this._generateIngressPatchPromises(oldFormValues.OriginalIngresses, ingresses)); - } - } - }); - oldServices.forEach(async (oldService) => { const newServiceMatched = _.find(newServices, { Name: oldService.Name }); if (!newServiceMatched) { await this.KubernetesServiceService.deleteSingle(oldService); - if (oldService.Ingress) { - const ingresses = KubernetesIngressConverter.deleteIngressByServiceName(oldFormValues, oldService); - await Promise.all(this._generateIngressPatchPromises(oldFormValues.OriginalIngresses, ingresses)); - } } }); + + newServices.forEach(async (newService) => { + const oldServiceMatched = _.find(oldServices, { Name: newService.Name }); + if (oldServiceMatched) { + await this.KubernetesServiceService.patch(oldServiceMatched, newService); + } else { + await this.KubernetesServiceService.create(newService); + } + }); + + // Clear all ingress which is related to services in this application + const clearIngress = KubernetesIngressConverter.removeIngressesPaths(oldFormValues.OriginalIngresses, oldServices); + + // Generate all ingress from services in this application + const newIngress = KubernetesIngressConverter.generateNewIngresses(clearIngress, newServices); + + // Compare new ingress with old ingress to get api patch + await Promise.all(this._generateIngressPatchPromises(oldFormValues.OriginalIngresses, newIngress)); } const newKind = KubernetesHorizontalPodAutoScalerHelper.getApplicationTypeString(newApp);