From 8d6f6e306affe976e15813c6dd3ae9817cdf661a Mon Sep 17 00:00:00 2001 From: xAt0mZ Date: Sun, 16 Aug 2020 00:11:56 +0200 Subject: [PATCH] feat(k8s/application): add placement constraints validation (#4214) * feat(k8s/application): add constraints validation * feat(k8s/application): minor UI update Co-authored-by: Anthony Lapenna --- .../models/application/formValues.js | 7 +++ .../create/createApplication.html | 15 ++++- .../create/createApplicationController.js | 61 +++++++++---------- 3 files changed, 47 insertions(+), 36 deletions(-) diff --git a/app/kubernetes/models/application/formValues.js b/app/kubernetes/models/application/formValues.js index 4a8e6cb79..0fcedf6b1 100644 --- a/app/kubernetes/models/application/formValues.js +++ b/app/kubernetes/models/application/formValues.js @@ -150,3 +150,10 @@ export class KubernetesApplicationAutoScalerFormValue { Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplicationAutoScalerFormValue))); } } + +export function KubernetesApplicationFormValidationDuplicate() { + return { + refs: {}, + hasDuplicates: false, + }; +} diff --git a/app/kubernetes/views/applications/create/createApplication.html b/app/kubernetes/views/applications/create/createApplication.html index 17a815ad0..588534839 100644 --- a/app/kubernetes/views/applications/create/createApplication.html +++ b/app/kubernetes/views/applications/create/createApplication.html @@ -944,17 +944,17 @@
- Deploy this application on nodes that respect ALL of the following placement rules. + Deploy this application on nodes that respect ALL of the following placement rules. Placement rules are based on node labels.
-
+
@@ -978,6 +978,15 @@
+
+
+
+

+ This label is already defined. +

+
+
+
diff --git a/app/kubernetes/views/applications/create/createApplicationController.js b/app/kubernetes/views/applications/create/createApplicationController.js index a9e92639f..b41711b41 100644 --- a/app/kubernetes/views/applications/create/createApplicationController.js +++ b/app/kubernetes/views/applications/create/createApplicationController.js @@ -20,6 +20,7 @@ import { KubernetesApplicationPersistedFolderFormValue, KubernetesApplicationPublishedPortFormValue, KubernetesApplicationPlacementFormValue, + KubernetesApplicationFormValidationDuplicate, } from 'Kubernetes/models/application/formValues'; import KubernetesFormValidationHelper from 'Kubernetes/helpers/formValidationHelper'; import KubernetesApplicationConverter from 'Kubernetes/converters/application'; @@ -259,10 +260,12 @@ class KubernetesCreateApplicationController { placement.Label = label; placement.Value = label.Values[0]; this.formValues.Placements.push(placement); + this.onChangePlacement(); } restorePlacement(index) { this.formValues.Placements[index].NeedsDeletion = false; + this.onChangePlacement(); } removePlacement(index) { @@ -271,10 +274,25 @@ class KubernetesCreateApplicationController { } else { this.formValues.Placements.splice(index, 1); } + this.onChangePlacement(); } - onPlacementLabelChange(index) { + // call all validation functions when a placement is added/removed/restored + onChangePlacement() { + this.onChangePlacementLabelValidate(); + } + + onChangePlacementLabel(index) { this.formValues.Placements[index].Value = this.formValues.Placements[index].Label.Values[0]; + this.onChangePlacementLabelValidate(); + } + + onChangePlacementLabelValidate() { + const state = this.state.duplicates.placements; + const source = _.map(this.formValues.Placements, (p) => (p.NeedsDeletion ? undefined : p.Label.Key)); + const duplicates = KubernetesFormValidationHelper.getDuplicates(source); + state.refs = duplicates; + state.hasDuplicates = Object.keys(duplicates).length > 0; } /* #endregion */ @@ -816,40 +834,17 @@ class KubernetesCreateApplicationController { availableSizeUnits: ['MB', 'GB', 'TB'], alreadyExists: false, duplicates: { - environmentVariables: { - refs: {}, - hasDuplicates: false, - }, - persistedFolders: { - refs: {}, - hasDuplicates: false, - }, - configurationPaths: { - refs: {}, - hasDuplicates: false, - }, - existingVolumes: { - refs: {}, - hasDuplicates: false, - }, + environmentVariables: new KubernetesApplicationFormValidationDuplicate(), + persistedFolders: new KubernetesApplicationFormValidationDuplicate(), + configurationPaths: new KubernetesApplicationFormValidationDuplicate(), + existingVolumes: new KubernetesApplicationFormValidationDuplicate(), publishedPorts: { - containerPorts: { - refs: {}, - hasDuplicates: false, - }, - nodePorts: { - refs: {}, - hasDuplicates: false, - }, - ingressRoutes: { - refs: {}, - hasDuplicates: false, - }, - loadBalancerPorts: { - refs: {}, - hasDuplicates: false, - }, + containerPorts: new KubernetesApplicationFormValidationDuplicate(), + nodePorts: new KubernetesApplicationFormValidationDuplicate(), + ingressRoutes: new KubernetesApplicationFormValidationDuplicate(), + loadBalancerPorts: new KubernetesApplicationFormValidationDuplicate(), }, + placements: new KubernetesApplicationFormValidationDuplicate(), }, isEdit: false, params: {