1
0
Fork 0
mirror of https://github.com/portainer/portainer.git synced 2025-07-24 07:49:41 +02:00

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
This commit is contained in:
Maxime Bajeux 2021-01-12 02:35:59 +01:00 committed by GitHub
parent cbd7fdc62e
commit 4cd468ce21
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 13 additions and 6 deletions

View file

@ -39,7 +39,8 @@ class KubernetesConfigMapConverter {
const res = new KubernetesConfigMapCreatePayload(); const res = new KubernetesConfigMapCreatePayload();
res.metadata.name = data.Name; res.metadata.name = data.Name;
res.metadata.namespace = data.Namespace; 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; res.data = data.Data;
return res; return res;
} }

View file

@ -1,5 +1,4 @@
import * as JsonPatch from 'fast-json-patch'; import * as JsonPatch from 'fast-json-patch';
import { KubernetesDaemonSet } from 'Kubernetes/models/daemon-set/models'; import { KubernetesDaemonSet } from 'Kubernetes/models/daemon-set/models';
import { KubernetesDaemonSetCreatePayload } from 'Kubernetes/models/daemon-set/payloads'; import { KubernetesDaemonSetCreatePayload } from 'Kubernetes/models/daemon-set/payloads';
import { import {

View file

@ -1,3 +1,4 @@
import _ from 'lodash-es';
import { KubernetesNamespace } from 'Kubernetes/models/namespace/models'; import { KubernetesNamespace } from 'Kubernetes/models/namespace/models';
import { KubernetesNamespaceCreatePayload } from 'Kubernetes/models/namespace/payloads'; import { KubernetesNamespaceCreatePayload } from 'Kubernetes/models/namespace/payloads';
import { KubernetesPortainerResourcePoolNameLabel, KubernetesPortainerResourcePoolOwnerLabel } from 'Kubernetes/models/resource-pool/models'; import { KubernetesPortainerResourcePoolNameLabel, KubernetesPortainerResourcePoolOwnerLabel } from 'Kubernetes/models/resource-pool/models';
@ -20,7 +21,8 @@ class KubernetesNamespaceConverter {
res.metadata.name = namespace.Name; res.metadata.name = namespace.Name;
res.metadata.labels[KubernetesPortainerResourcePoolNameLabel] = namespace.ResourcePoolName; res.metadata.labels[KubernetesPortainerResourcePoolNameLabel] = namespace.ResourcePoolName;
if (namespace.ResourcePoolOwner) { if (namespace.ResourcePoolOwner) {
res.metadata.labels[KubernetesPortainerResourcePoolOwnerLabel] = namespace.ResourcePoolOwner; const resourcePoolOwner = _.truncate(namespace.ResourcePoolOwner, { length: 63, omission: '' });
res.metadata.labels[KubernetesPortainerResourcePoolOwnerLabel] = resourcePoolOwner;
} }
return res; return res;
} }

View file

@ -9,7 +9,8 @@ class KubernetesSecretConverter {
const res = new KubernetesSecretCreatePayload(); const res = new KubernetesSecretCreatePayload();
res.metadata.name = secret.Name; res.metadata.name = secret.Name;
res.metadata.namespace = secret.Namespace; 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; res.stringData = secret.Data;
return res; return res;
} }

View file

@ -69,7 +69,7 @@ class KubernetesServiceConverter {
payload.metadata.namespace = service.Namespace; payload.metadata.namespace = service.Namespace;
payload.metadata.labels[KubernetesPortainerApplicationStackNameLabel] = service.StackName; payload.metadata.labels[KubernetesPortainerApplicationStackNameLabel] = service.StackName;
payload.metadata.labels[KubernetesPortainerApplicationNameLabel] = service.ApplicationName; 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.ports = service.Ports;
payload.spec.selector.app = service.ApplicationName; payload.spec.selector.app = service.ApplicationName;
if (service.Headless) { if (service.Headless) {

View file

@ -10,7 +10,11 @@ class KubernetesCommonHelper {
} }
static ownerToLabel(owner) { 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; export default KubernetesCommonHelper;