From 4cd468ce21bb584cac765c55a132a927274a3680 Mon Sep 17 00:00:00 2001 From: Maxime Bajeux Date: Tue, 12 Jan 2021 02:35:59 +0100 Subject: [PATCH] Can't create kubernetes resources with a username longer than 63 characters (#4672) * fix(kubernetes): truncate username when we create resource * fix(k8s): remove forbidden characters in owner label --- app/kubernetes/converters/configMap.js | 3 ++- app/kubernetes/converters/daemonSet.js | 1 - app/kubernetes/converters/namespace.js | 4 +++- app/kubernetes/converters/secret.js | 3 ++- app/kubernetes/converters/service.js | 2 +- app/kubernetes/helpers/commonHelper.js | 6 +++++- 6 files changed, 13 insertions(+), 6 deletions(-) diff --git a/app/kubernetes/converters/configMap.js b/app/kubernetes/converters/configMap.js index 76c142145..1c3e09b63 100644 --- a/app/kubernetes/converters/configMap.js +++ b/app/kubernetes/converters/configMap.js @@ -39,7 +39,8 @@ class KubernetesConfigMapConverter { const res = new KubernetesConfigMapCreatePayload(); res.metadata.name = data.Name; res.metadata.namespace = data.Namespace; - res.metadata.labels[KubernetesPortainerConfigurationOwnerLabel] = data.ConfigurationOwner; + const configurationOwner = _.truncate(data.ConfigurationOwner, { length: 63, omission: '' }); + res.metadata.labels[KubernetesPortainerConfigurationOwnerLabel] = configurationOwner; res.data = data.Data; return res; } diff --git a/app/kubernetes/converters/daemonSet.js b/app/kubernetes/converters/daemonSet.js index 8360ca9a7..063005593 100644 --- a/app/kubernetes/converters/daemonSet.js +++ b/app/kubernetes/converters/daemonSet.js @@ -1,5 +1,4 @@ import * as JsonPatch from 'fast-json-patch'; - import { KubernetesDaemonSet } from 'Kubernetes/models/daemon-set/models'; import { KubernetesDaemonSetCreatePayload } from 'Kubernetes/models/daemon-set/payloads'; import { diff --git a/app/kubernetes/converters/namespace.js b/app/kubernetes/converters/namespace.js index 2a95a4c95..46f2c33e3 100644 --- a/app/kubernetes/converters/namespace.js +++ b/app/kubernetes/converters/namespace.js @@ -1,3 +1,4 @@ +import _ from 'lodash-es'; import { KubernetesNamespace } from 'Kubernetes/models/namespace/models'; import { KubernetesNamespaceCreatePayload } from 'Kubernetes/models/namespace/payloads'; import { KubernetesPortainerResourcePoolNameLabel, KubernetesPortainerResourcePoolOwnerLabel } from 'Kubernetes/models/resource-pool/models'; @@ -20,7 +21,8 @@ class KubernetesNamespaceConverter { res.metadata.name = namespace.Name; res.metadata.labels[KubernetesPortainerResourcePoolNameLabel] = namespace.ResourcePoolName; if (namespace.ResourcePoolOwner) { - res.metadata.labels[KubernetesPortainerResourcePoolOwnerLabel] = namespace.ResourcePoolOwner; + const resourcePoolOwner = _.truncate(namespace.ResourcePoolOwner, { length: 63, omission: '' }); + res.metadata.labels[KubernetesPortainerResourcePoolOwnerLabel] = resourcePoolOwner; } return res; } diff --git a/app/kubernetes/converters/secret.js b/app/kubernetes/converters/secret.js index 8c05e46bb..14eee19e5 100644 --- a/app/kubernetes/converters/secret.js +++ b/app/kubernetes/converters/secret.js @@ -9,7 +9,8 @@ class KubernetesSecretConverter { const res = new KubernetesSecretCreatePayload(); res.metadata.name = secret.Name; res.metadata.namespace = secret.Namespace; - res.metadata.labels[KubernetesPortainerConfigurationOwnerLabel] = secret.ConfigurationOwner; + const configurationOwner = _.truncate(secret.configurationOwner, { length: 63, omission: '' }); + res.metadata.labels[KubernetesPortainerConfigurationOwnerLabel] = configurationOwner; res.stringData = secret.Data; return res; } diff --git a/app/kubernetes/converters/service.js b/app/kubernetes/converters/service.js index 6376bf3d6..7c8897be5 100644 --- a/app/kubernetes/converters/service.js +++ b/app/kubernetes/converters/service.js @@ -69,7 +69,7 @@ class KubernetesServiceConverter { payload.metadata.namespace = service.Namespace; payload.metadata.labels[KubernetesPortainerApplicationStackNameLabel] = service.StackName; payload.metadata.labels[KubernetesPortainerApplicationNameLabel] = service.ApplicationName; - payload.metadata.labels[KubernetesPortainerApplicationOwnerLabel] = service.ApplicationOwner; + payload.metadata.labels[KubernetesPortainerApplicationOwnerLabel] = service.Application; payload.spec.ports = service.Ports; payload.spec.selector.app = service.ApplicationName; if (service.Headless) { diff --git a/app/kubernetes/helpers/commonHelper.js b/app/kubernetes/helpers/commonHelper.js index 9767de3b9..fab1bdf28 100644 --- a/app/kubernetes/helpers/commonHelper.js +++ b/app/kubernetes/helpers/commonHelper.js @@ -10,7 +10,11 @@ class KubernetesCommonHelper { } static ownerToLabel(owner) { - return _.replace(owner, /[^-A-Za-z0-9_.]/g, '.'); + let label = _.replace(owner, /[^-A-Za-z0-9_.]/g, '.'); + label = _.truncate(label, { length: 63, omission: '' }); + label = _.replace(label, /^[-_.]*/g, ''); + label = _.replace(label, /[-_.]*$/g, ''); + return label; } } export default KubernetesCommonHelper;