From 496e29c3732929e741ea04b38a219ea4e277cd19 Mon Sep 17 00:00:00 2001 From: Julian Kahnert Date: Sun, 19 Jan 2020 22:11:43 +0100 Subject: [PATCH 1/4] change naming convention: switch from hash to slugified string --- src/main/java/de/worldiety/autocd/Main.java | 6 ++---- .../java/de/worldiety/autocd/k8s/K8sClient.java | 16 ++++++++++------ src/main/java/de/worldiety/autocd/util/Util.java | 8 +++++++- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/main/java/de/worldiety/autocd/Main.java b/src/main/java/de/worldiety/autocd/Main.java index f9d532f..f108291 100644 --- a/src/main/java/de/worldiety/autocd/Main.java +++ b/src/main/java/de/worldiety/autocd/Main.java @@ -212,16 +212,14 @@ private static void removeWithDependencies(AutoCD autoCD, K8sClient k8sClient) { } /** - * Creates a name for a depending service out of the project name and a hashed registry image path from the main service + * Creates a name for a depending service * * @param main * @param other */ private static void setServiceNameForOtherImages(AutoCD main, AutoCD other) { if (other.getServiceName() == null) { - other.setServiceName(Util.hash( - System.getenv(Environment.CI_PROJECT_NAME.toString()) + main.getIdentifierRegistryImagePath()).substring(0, 20) - ); + other.setServiceName(Util.slugify(main.getServiceName() + "-" + main.getIdentifierRegistryImagePath())); } } diff --git a/src/main/java/de/worldiety/autocd/k8s/K8sClient.java b/src/main/java/de/worldiety/autocd/k8s/K8sClient.java index c11f7e3..1d8e125 100644 --- a/src/main/java/de/worldiety/autocd/k8s/K8sClient.java +++ b/src/main/java/de/worldiety/autocd/k8s/K8sClient.java @@ -149,7 +149,7 @@ private void deleteStatefulSet(V1StatefulSet set) { private V1StatefulSet getStatefulSet(AutoCD autoCD) { var meta = getNamespacedMeta(); var projName = System.getenv(Environment.CI_PROJECT_NAME.toString()); - meta.setName(Util.hash(getNamespaceString() + autoCD.getIdentifierRegistryImagePath() + projName).substring(0, 20)); + meta.setName(Util.slugify(projName + "--" + autoCD.getServiceName())); var labels = Map.of("k8s-app", getK8sApp(autoCD), "serviceName", getCleanServiceNameLabel(autoCD)); meta.setLabels(labels); @@ -576,6 +576,10 @@ private void createNamespace(V1Namespace nameSpace) { @NotNull private String getPVCName(Volume volume, @NotNull AutoCD autoCD) { + // TODO: we should switch to an unhashed version for readability reasons - what is the best way to migrate the old porjects? +// var str = getNamespaceString() + "--" + getServiceName(autoCD) + "--" + "claim" + autoCD.getVolumes().indexOf(volume); +// return Util.slugify(str); + var str = getNamespaceString() + "-" + getName() + "-" + autoCD.getIdentifierRegistryImagePath() + "-" + autoCD.getVolumes().indexOf(volume) + "-claim"; return hash(str).substring(0, 20); } @@ -627,7 +631,7 @@ private List getIngress(@NotNull AutoCD autoCD) { var ingress = new ExtensionsV1beta1Ingress(); ingress.setKind("Ingress"); var meta = getNamespacedMeta(); - meta.setName(Util.hash(subdomain + getNamespaceString() + "-" + getName() + "-ingress" + autoCD.getIdentifierRegistryImagePath()).substring(0, 20)); + meta.setName(Util.slugify(getNamespaceString() + "--" + subdomain + "--" + getName())); meta.setAnnotations(Map.of("cert-manager.io/cluster-issuer", "letsencrypt-prod", "kubernetes.io/ingress.class", "nginx")); @@ -647,7 +651,7 @@ private List getIngress(@NotNull AutoCD autoCD) { .withRules(rules.build()) .withTls(new ExtensionsV1beta1IngressTLSBuilder() .withHosts(subdomain) - .withSecretName(Util.hash(subdomain).substring(0, 10)) + .withSecretName(Util.slugify(getNamespaceString() + "--" + subdomain)) .build()) .build(); @@ -691,7 +695,7 @@ private String getServiceName(@NotNull AutoCD autoCD) { return autoCD.getServiceName(); } - return "service-" + Util.hash(getNamespaceString() + "-" + getName() + "-service").substring(0, 20); + return Util.slugify("service--" + getName()); } @NotNull @@ -718,7 +722,7 @@ private V1Service getService(@NotNull AutoCD autoCD) { private ExtensionsV1beta1Deployment getDeployment(@NotNull AutoCD autoCD) { var meta = getNamespacedMeta(); var projName = System.getenv(Environment.CI_PROJECT_NAME.toString()); - meta.setName(Util.hash(getNamespaceString() + autoCD.getIdentifierRegistryImagePath() + projName)); + meta.setName(Util.slugify(projName + "--" + autoCD.getServiceName())); var labels = Map.of("k8s-app", getK8sApp(autoCD)); meta.setLabels(labels); @@ -819,7 +823,7 @@ private V1ContainerBuilder getV1ContainerBuilder(@NotNull AutoCD autoCD) { @NotNull private String getK8sApp(@NotNull AutoCD autoCD) { - return Util.hash(getNamespaceString() + "-" + getName() + "-" + Util.hash(autoCD.getIdentifierRegistryImagePath())).substring(0, 20) + hyphenedBuildType; + return Util.slugify(getNamespaceString() + "-" + autoCD.getServiceName()); } /** diff --git a/src/main/java/de/worldiety/autocd/util/Util.java b/src/main/java/de/worldiety/autocd/util/Util.java index f0b86f7..48a82b5 100644 --- a/src/main/java/de/worldiety/autocd/util/Util.java +++ b/src/main/java/de/worldiety/autocd/util/Util.java @@ -51,7 +51,6 @@ private static String bytesToHex(byte[] hash) { return hexString.toString(); } - public static String hash(String toHash) { MessageDigest digest = null; try { @@ -64,4 +63,11 @@ public static String hash(String toHash) { return Util.bytesToHex(encodedhash); } + + public static String slugify(String toSlug) { + if (toSlug == null) { + return null; + } + return toSlug.replaceAll("[^a-zA-Z\\-]", "").substring(0, Integer.min(toSlug.length(), 255)); + } } From ae5696b246380de3ef0fc38c40ed7ba4eb3159ff Mon Sep 17 00:00:00 2001 From: Julian Kahnert Date: Sun, 19 Jan 2020 22:42:27 +0100 Subject: [PATCH 2/4] linting fix --- src/main/java/de/worldiety/autocd/k8s/K8sClient.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/worldiety/autocd/k8s/K8sClient.java b/src/main/java/de/worldiety/autocd/k8s/K8sClient.java index 1d8e125..249b3b4 100644 --- a/src/main/java/de/worldiety/autocd/k8s/K8sClient.java +++ b/src/main/java/de/worldiety/autocd/k8s/K8sClient.java @@ -577,8 +577,8 @@ private void createNamespace(V1Namespace nameSpace) { @NotNull private String getPVCName(Volume volume, @NotNull AutoCD autoCD) { // TODO: we should switch to an unhashed version for readability reasons - what is the best way to migrate the old porjects? -// var str = getNamespaceString() + "--" + getServiceName(autoCD) + "--" + "claim" + autoCD.getVolumes().indexOf(volume); -// return Util.slugify(str); + //var str = getNamespaceString() + "--" + getServiceName(autoCD) + "--" + "claim" + autoCD.getVolumes().indexOf(volume); + //return Util.slugify(str); var str = getNamespaceString() + "-" + getName() + "-" + autoCD.getIdentifierRegistryImagePath() + "-" + autoCD.getVolumes().indexOf(volume) + "-claim"; return hash(str).substring(0, 20); From 0966cd69edd95c7b725d5b895e6f812a5388c9ca Mon Sep 17 00:00:00 2001 From: Julian Kahnert Date: Sun, 19 Jan 2020 22:59:21 +0100 Subject: [PATCH 3/4] bugfix --- src/main/java/de/worldiety/autocd/util/Util.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/worldiety/autocd/util/Util.java b/src/main/java/de/worldiety/autocd/util/Util.java index 48a82b5..205a048 100644 --- a/src/main/java/de/worldiety/autocd/util/Util.java +++ b/src/main/java/de/worldiety/autocd/util/Util.java @@ -68,6 +68,7 @@ public static String slugify(String toSlug) { if (toSlug == null) { return null; } - return toSlug.replaceAll("[^a-zA-Z\\-]", "").substring(0, Integer.min(toSlug.length(), 255)); + String slugified = toSlug.replaceAll("[^a-zA-Z\\-]", ""); + return slugified.substring(0, Integer.min(slugified.length(), 255)); } } From 3c5d5a84c45d3f04692591bbc0d8500903178864 Mon Sep 17 00:00:00 2001 From: Julian Kahnert Date: Sun, 19 Jan 2020 23:24:39 +0100 Subject: [PATCH 4/4] changes after code review --- src/main/java/de/worldiety/autocd/k8s/K8sClient.java | 9 ++++++++- src/main/java/de/worldiety/autocd/util/Util.java | 8 ++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/worldiety/autocd/k8s/K8sClient.java b/src/main/java/de/worldiety/autocd/k8s/K8sClient.java index 249b3b4..68e6b21 100644 --- a/src/main/java/de/worldiety/autocd/k8s/K8sClient.java +++ b/src/main/java/de/worldiety/autocd/k8s/K8sClient.java @@ -695,7 +695,14 @@ private String getServiceName(@NotNull AutoCD autoCD) { return autoCD.getServiceName(); } - return Util.slugify("service--" + getName()); + String serviceName = "service--" + getName(); + + // Validate the length of the new service name - should be less then 63 characters: + // https://github.com/kubernetes/kubernetes/blob/master/pkg/apis/discovery/types.go#L122-L130 + if (serviceName.length() > 63) { + throw new IllegalArgumentException("The service name MUST NOT have more then 63 characters!"); + } + return serviceName; } @NotNull diff --git a/src/main/java/de/worldiety/autocd/util/Util.java b/src/main/java/de/worldiety/autocd/util/Util.java index 205a048..9a49855 100644 --- a/src/main/java/de/worldiety/autocd/util/Util.java +++ b/src/main/java/de/worldiety/autocd/util/Util.java @@ -65,10 +65,14 @@ public static String hash(String toHash) { } public static String slugify(String toSlug) { + return slugify(toSlug, 255); + } + + public static String slugify(String toSlug, int maxLength) { if (toSlug == null) { return null; } - String slugified = toSlug.replaceAll("[^a-zA-Z\\-]", ""); - return slugified.substring(0, Integer.min(slugified.length(), 255)); + String slugified = toSlug.toLowerCase().replaceAll("[^a-z0-9\\-]", ""); + return slugified.substring(0, Integer.min(slugified.length(), maxLength)); } }