From 42c0d851c73f6d9f6efd3303d805541dd2982ab4 Mon Sep 17 00:00:00 2001 From: Sondre Nordjore Date: Wed, 28 May 2025 09:04:54 +0200 Subject: [PATCH 1/4] refactored to use uuid --- .../no/fintlabs/operator/NameFactory.java | 30 +++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/main/java/no/fintlabs/operator/NameFactory.java b/src/main/java/no/fintlabs/operator/NameFactory.java index 2ead677..2ac10d8 100644 --- a/src/main/java/no/fintlabs/operator/NameFactory.java +++ b/src/main/java/no/fintlabs/operator/NameFactory.java @@ -2,13 +2,33 @@ import io.fabric8.kubernetes.api.model.HasMetadata; +import java.util.UUID; + public class NameFactory { public static String nameFromMetadata(HasMetadata metadata) { - return String.format("%s_%s_%s", - metadata.getMetadata().getLabels().get("fintlabs.no/org-id").replace(".", "-"), - metadata.getMetadata().getLabels().get("fintlabs.no/team"), - metadata.getMetadata().getName() - ); + + String orgId = metadata.getMetadata().getLabels().get("fintlabs.no/org-id").replace(".", "-"); + String team = metadata.getMetadata().getLabels().get("fintlabs.no/team"); + String name = metadata.getMetadata().getName(); + String uuid = UUID.randomUUID().toString().replace("-", "").substring(0, 16); + + int maxCombinedPrefix = 64 - 19; + int totalPrefixLength = orgId.length() + team.length() + name.length(); + if (totalPrefixLength > maxCombinedPrefix) { + double orgRatio = (double) orgId.length() / totalPrefixLength; + double teamRatio = (double) team.length() / totalPrefixLength; + double nameRatio = (double) name.length() / totalPrefixLength; + + int maxOrgLength = (int) Math.floor(maxCombinedPrefix * orgRatio); + int maxTeamLength = (int) Math.floor(maxCombinedPrefix * teamRatio); + int maxNameLength = maxCombinedPrefix - maxOrgLength - maxTeamLength; + + orgId = orgId.substring(0, Math.min(orgId.length(), maxOrgLength)); + team = team.substring(0, Math.min(team.length(), maxTeamLength)); + name = name.substring(0, Math.min(name.length(), maxNameLength)); + } + + return String.format("%s-%s-%s-%s", orgId, team, name, uuid); } } From bcce365dded7a1a3ed40d2d5c18dea09805af1b3 Mon Sep 17 00:00:00 2001 From: Sondre Nordjore Date: Wed, 28 May 2025 09:06:03 +0200 Subject: [PATCH 2/4] set up tests for name factory --- .../fintlabs/operator/NameFactorySpec.groovy | 36 +++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/src/test/groovy/no/fintlabs/operator/NameFactorySpec.groovy b/src/test/groovy/no/fintlabs/operator/NameFactorySpec.groovy index d03f872..c1e5618 100644 --- a/src/test/groovy/no/fintlabs/operator/NameFactorySpec.groovy +++ b/src/test/groovy/no/fintlabs/operator/NameFactorySpec.groovy @@ -4,10 +4,10 @@ import spock.lang.Specification class NameFactorySpec extends Specification { - def "Name should contain orgId and team"() { + def "Generated name should include orgId, team and UUID"() { given: def crd = new KafkaUserAndAclCrd() - crd.getMetadata().getLabels().put("fintlabs.no/team", "flais") + crd.getMetadata().getLabels().put("fintlabs.no/team", "testteam") crd.getMetadata().getLabels().put("fintlabs.no/org-id", "flais.io") crd.getMetadata().setName("fint-data-service") @@ -15,6 +15,36 @@ class NameFactorySpec extends Specification { def name = NameFactory.nameFromMetadata(crd) then: - name == "flais-io_flais_fint-data-service" + def parts = name.split("-") + parts.length >= 4 + + and: "UUID Should me last and 16 characters" + parts[-1] ==~ /^[a-f0-9]{16}$/ + + and: "Final string should be max 64 characters" + name.length() <= 64 + + and: "OrgID, team, and name should be included" + name.contains("test") + name.contains("flais") + name.contains("fint") + } + + def "Should handle long orgId, team and name correctly"() { + given: + def crd = new KafkaUserAndAclCrd() + crd.getMetadata().getLabels().put("fintlabs.no/team", "very-long-team-name-that-blows-all-borders") + crd.getMetadata().getLabels().put("fintlabs.no/org-id", "insanely.long.organisation.identifier.that.exceeds.all.limits") + crd.getMetadata().setName("well-ok-we-know-this-name-is-too-long-now-right") + + when: + def name = NameFactory.nameFromMetadata(crd) + + then: + name.length() <= 64 + + and: def uuid = name.split("-")[-1] + uuid.length() == 16 + uuid ==~ /^[a-f0-9]{16}$/ } } From bd334759000d156a6b76f218b279b50d7fc33fd3 Mon Sep 17 00:00:00 2001 From: Sondre Nordjore Date: Mon, 2 Jun 2025 15:08:12 +0200 Subject: [PATCH 3/4] rewrite to just GUID, and support legacy code --- .../no/fintlabs/operator/NameFactory.java | 37 ++++++++----------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/src/main/java/no/fintlabs/operator/NameFactory.java b/src/main/java/no/fintlabs/operator/NameFactory.java index 2ac10d8..26255fc 100644 --- a/src/main/java/no/fintlabs/operator/NameFactory.java +++ b/src/main/java/no/fintlabs/operator/NameFactory.java @@ -6,29 +6,24 @@ public class NameFactory { - public static String nameFromMetadata(HasMetadata metadata) { - - String orgId = metadata.getMetadata().getLabels().get("fintlabs.no/org-id").replace(".", "-"); - String team = metadata.getMetadata().getLabels().get("fintlabs.no/team"); - String name = metadata.getMetadata().getName(); - String uuid = UUID.randomUUID().toString().replace("-", "").substring(0, 16); - - int maxCombinedPrefix = 64 - 19; - int totalPrefixLength = orgId.length() + team.length() + name.length(); - if (totalPrefixLength > maxCombinedPrefix) { - double orgRatio = (double) orgId.length() / totalPrefixLength; - double teamRatio = (double) team.length() / totalPrefixLength; - double nameRatio = (double) name.length() / totalPrefixLength; + public static String legacyNameFromMetadata(HasMetadata metadata) { + return String.format("%s_%s_%s", + metadata.getMetadata().getLabels().get("fintlabs.no/org-id").replace(".", "-"), + metadata.getMetadata().getLabels().get("fintlabs.no/team"), + metadata.getMetadata().getName() + ); + } - int maxOrgLength = (int) Math.floor(maxCombinedPrefix * orgRatio); - int maxTeamLength = (int) Math.floor(maxCombinedPrefix * teamRatio); - int maxNameLength = maxCombinedPrefix - maxOrgLength - maxTeamLength; + public static String guidNameFromMetadata() { + return UUID.randomUUID().toString(); + } - orgId = orgId.substring(0, Math.min(orgId.length(), maxOrgLength)); - team = team.substring(0, Math.min(team.length(), maxTeamLength)); - name = name.substring(0, Math.min(name.length(), maxNameLength)); + public static String nameFromMetadata(HasMetadata metadata) { + String useGuid = metadata.getMetadata().getLabels().get("fintlabs.no/use-guid"); + if ("true".equalsIgnoreCase(useGuid)) { + return guidNameFromMetadata(); + } else { + return legacyNameFromMetadata(metadata); } - - return String.format("%s-%s-%s-%s", orgId, team, name, uuid); } } From a191133de554fb11b37bff0c702054acee075422 Mon Sep 17 00:00:00 2001 From: Sondre Nordjore Date: Thu, 5 Jun 2025 12:26:00 +0200 Subject: [PATCH 4/4] added tests --- .../fintlabs/operator/NameFactorySpec.groovy | 50 +++++++++++-------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/src/test/groovy/no/fintlabs/operator/NameFactorySpec.groovy b/src/test/groovy/no/fintlabs/operator/NameFactorySpec.groovy index c1e5618..bef988d 100644 --- a/src/test/groovy/no/fintlabs/operator/NameFactorySpec.groovy +++ b/src/test/groovy/no/fintlabs/operator/NameFactorySpec.groovy @@ -4,47 +4,53 @@ import spock.lang.Specification class NameFactorySpec extends Specification { - def "Generated name should include orgId, team and UUID"() { + def "Legacy should include orgId, team and name"() { given: def crd = new KafkaUserAndAclCrd() - crd.getMetadata().getLabels().put("fintlabs.no/team", "testteam") + crd.getMetadata().getLabels().put("fintlabs.no/team", "test-team") crd.getMetadata().getLabels().put("fintlabs.no/org-id", "flais.io") crd.getMetadata().setName("fint-data-service") when: - def name = NameFactory.nameFromMetadata(crd) + def name = NameFactory.legacyNameFromMetadata(crd) then: - def parts = name.split("-") - parts.length >= 4 - - and: "UUID Should me last and 16 characters" - parts[-1] ==~ /^[a-f0-9]{16}$/ + name.equals("flais-io_test-team_fint-data-service") + } - and: "Final string should be max 64 characters" - name.length() <= 64 + def "guidNameFromMetadata should return valid UUID format"() { + when: + def guid = NameFactory.guidNameFromMetadata() - and: "OrgID, team, and name should be included" - name.contains("test") - name.contains("flais") - name.contains("fint") + then: + guid.matches(/[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/) + guid.length() <= 64 } - def "Should handle long orgId, team and name correctly"() { + def "nameFromMetadata should return GUID name is use-guid is set to true"() { given: def crd = new KafkaUserAndAclCrd() - crd.getMetadata().getLabels().put("fintlabs.no/team", "very-long-team-name-that-blows-all-borders") - crd.getMetadata().getLabels().put("fintlabs.no/org-id", "insanely.long.organisation.identifier.that.exceeds.all.limits") - crd.getMetadata().setName("well-ok-we-know-this-name-is-too-long-now-right") + crd.getMetadata().getLabels().put("fintlabs.no/use-guid", "true") when: def name = NameFactory.nameFromMetadata(crd) then: - name.length() <= 64 + name.matches(/[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/) + } - and: def uuid = name.split("-")[-1] - uuid.length() == 16 - uuid ==~ /^[a-f0-9]{16}$/ + def "nameFromMetadata should return legacy name if use-guid is not true"() { + given: + def crd = new KafkaUserAndAclCrd() + crd.getMetadata().getLabels().put("fintlabs.no/team", "test-team") + crd.getMetadata().getLabels().put("fintlabs.no/org-id", "flais.io") + crd.getMetadata().getLabels().put("fintlabs.no/use-guid", "false") + crd.getMetadata().setName("fint-data-service") + + when: + def name = NameFactory.nameFromMetadata(crd) + + then: + name.equals("flais-io_test-team_fint-data-service") } }