From 5d25b49c5ef0dfe271ec80f81c2d3c6d865e064d Mon Sep 17 00:00:00 2001 From: Sondre Nordjore Date: Fri, 24 Apr 2026 13:50:43 +0200 Subject: [PATCH] - bumped versions - updated readme - updated to use LdapNameGeneratorUtil - added and made tests for LdapNameGeneratorUtil - added adapter dependent resource test - added tests for adapter - added assets to fint adapter - updated ghactions - added dependabot --- .github/dependabot.yaml | 7 ++ .github/workflows/.build-publish-docker.yaml | 53 +++++++++++ .github/workflows/.cluster-deploy.yaml | 54 +++++++++++ .github/workflows/.create-release.yaml | 32 +++++++ .github/workflows/build-deployment.yaml | 57 ++++++++++++ README.md | 36 +++++++- build.gradle | 4 +- examples/fint-adapter.yaml | 12 ++- examples/fint-adapter2.yaml | 13 +-- examples/fint-client.yaml | 10 +- .../base/fintadapters.fintlabs.no-v1.yml | 4 + kustomize/overlays/alpha/exclude-kafka.yaml | 10 ++ kustomize/overlays/alpha/kustomization.yaml | 15 ++- .../no/fintlabs/LdapNameGeneratorUtil.java | 60 ++++++++++++ .../java/no/fintlabs/adapter/Adapter.java | 20 ++++ .../adapter/FintAdapterDependentResource.java | 27 ++---- .../no/fintlabs/adapter/FintAdapterSpec.java | 1 + .../fintlabs/LdapNameGeneratorUtilTest.java | 91 +++++++++++++++++++ .../java/no/fintlabs/adapter/AdapterTest.java | 66 ++++++++++++++ .../FintAdapterDependentResourceTest.java | 89 ++++++++++++++++++ 20 files changed, 622 insertions(+), 39 deletions(-) create mode 100644 .github/dependabot.yaml create mode 100644 .github/workflows/.build-publish-docker.yaml create mode 100644 .github/workflows/.cluster-deploy.yaml create mode 100644 .github/workflows/.create-release.yaml create mode 100644 .github/workflows/build-deployment.yaml create mode 100644 kustomize/overlays/alpha/exclude-kafka.yaml create mode 100644 src/main/java/no/fintlabs/LdapNameGeneratorUtil.java create mode 100644 src/test/java/no/fintlabs/LdapNameGeneratorUtilTest.java create mode 100644 src/test/java/no/fintlabs/adapter/AdapterTest.java create mode 100644 src/test/java/no/fintlabs/adapter/FintAdapterDependentResourceTest.java diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml new file mode 100644 index 0000000..0318fac --- /dev/null +++ b/.github/dependabot.yaml @@ -0,0 +1,7 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + day: "sunday" diff --git a/.github/workflows/.build-publish-docker.yaml b/.github/workflows/.build-publish-docker.yaml new file mode 100644 index 0000000..337459b --- /dev/null +++ b/.github/workflows/.build-publish-docker.yaml @@ -0,0 +1,53 @@ +name: Build and publish + +on: + workflow_call: + outputs: + image-tags: + description: "Docker image with tag" + value: ${{ jobs.publish.outputs.image-tags }} + +permissions: + contents: read + packages: write + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + publish: + runs-on: ubuntu-latest + outputs: + image-tags: ${{ steps.meta.outputs.tags }} + + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Login to ghcr + uses: docker/login-action@v4 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) + id: meta + uses: docker/metadata-action@v6 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + type=sha,prefix={{date 'YYYY.MM.DD.HH.mm'}}-,format=short,priority=9002 + + - name: Build and push Docker image + uses: docker/build-push-action@v7 + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + + - name: Summarize + run: echo "Docker image ${{ steps.meta.outputs.tags }}" >> $GITHUB_STEP_SUMMARY + diff --git a/.github/workflows/.cluster-deploy.yaml b/.github/workflows/.cluster-deploy.yaml new file mode 100644 index 0000000..78ec2dc --- /dev/null +++ b/.github/workflows/.cluster-deploy.yaml @@ -0,0 +1,54 @@ +name: Cluster deploy + +on: + workflow_call: + inputs: + environment: + description: "Environment" + required: true + type: string + image-tags: + description: "Docker image with tag" + required: true + type: string + +jobs: + deploy-to-cluster: + name: Deploy to Cluster + runs-on: ubuntu-latest + + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Bake manifests with Kustomize + id: bake + uses: azure/k8s-bake@v4 + with: + renderEngine: "kustomize" + kustomizationPath: "kustomize/overlays/${{ inputs.environment }}" + + - name: Azure login + uses: azure/login@v2 + with: + creds: "${{ secrets[format('AKS_{0}_FINT_GITHUB', inputs.environment )] }}" + + - name: Set the target cluster + uses: azure/aks-set-context@v5 + with: + cluster-name: "${{ vars[format('{0}_CLUSTER_NAME', inputs.environment)] }}" + resource-group: "${{ vars[format('{0}_CLUSTER_RESOURCE_GROUP', inputs.environment)] }}" + admin: "true" + use-kubelogin: "true" + + - name: Deploy + uses: azure/k8s-deploy@v6 + with: + action: deploy + manifests: ${{ steps.bake.outputs.manifestsBundle }} + images: ${{ inputs.image-tags }} + pull-images: 'false' + namespace: operators diff --git a/.github/workflows/.create-release.yaml b/.github/workflows/.create-release.yaml new file mode 100644 index 0000000..21a22a9 --- /dev/null +++ b/.github/workflows/.create-release.yaml @@ -0,0 +1,32 @@ +name: Create release + +on: + workflow_call: + inputs: + image-tags: + description: 'Docker image with tag' + required: true + type: string + +jobs: + create-release: + name: Create release + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Extract tag from image reference + id: version + run: | + full_tag="${{ inputs.image-tags }}" + version="${full_tag##*:}" + echo "Extracted version: $version" + echo "version=$version" >> $GITHUB_OUTPUT + + - uses: ncipollo/release-action@v1 + with: + tag: ${{ steps.version.outputs.version }} + generateReleaseNotes: true diff --git a/.github/workflows/build-deployment.yaml b/.github/workflows/build-deployment.yaml new file mode 100644 index 0000000..c8d3f5e --- /dev/null +++ b/.github/workflows/build-deployment.yaml @@ -0,0 +1,57 @@ +name: Build and deploy +on: + workflow_dispatch: + inputs: + environment: + description: "Select environment" + required: true + default: "alpha" + type: choice + options: [alpha, beta, api] + +permissions: + actions: read + id-token: write + contents: write + packages: write + +jobs: + build-publish: + uses: ./.github/workflows/.build-publish-docker.yaml + secrets: inherit + + deploy-alpha: + if: github.event.name == 'workflow_dispatch' && inputs.environment == 'alpha' + uses: ./.github/workflows/.cluster-deploy.yaml + needs: build-publish + secrets: inherit + with: + environment: alpha + image-tags: ${{ needs.build-publish.outputs.image-tags }} + + + deploy-beta: + if: github.event_name == 'workflow_dispatch' && inputs.environment == 'beta' + uses: ./.github/workflows/.cluster-deploy.yaml + needs: build-publish + secrets: inherit + with: + environment: beta + image-tags: ${{ needs.build-publish.outputs.image-tags }} + + deploy-api: + if: github.event_name == 'workflow_dispatch' && inputs.environment == 'api' + uses: ./.github/workflows/.cluster-deploy.yaml + needs: build-publish + secrets: inherit + with: + environment: api + image-tags: ${{ needs.build-publish.outputs.image-tags }} + + create-release: + if: github.ref == 'refs/heads/prod' + uses: ./.github/workflows/.create-release.yaml + needs: [build-publish, deploy-api] + secrets: inherit + with: + image-tags: ${{ needs.build-publish.outputs.image-tags }} diff --git a/README.md b/README.md index e858cc4..9c27d55 100644 --- a/README.md +++ b/README.md @@ -9,28 +9,56 @@ for LibreSSL 3.3.6: openssl genpkey -algorithm rsa ``` +### Client +.yaml example file: +```yaml +apiVersion: fintlabs.no/v1alpha1 +kind: FintClient +metadata: + name: flais-test-client + namespace: fintlabs-no + labels: + app.kubernetes.io/name: test-client + app.kubernetes.io/instance: test-service-backend-client_county_no + app.kubernetes.io/version: latest + app.kubernetes.io/component: backend + app.kubernetes.io/part-of: arkiv + fintlabs.no/team: flais + fintlabs.no/org-id: fintlabs.no +spec: + orgId: fintlabs.no + note: Dette er en test. Nu kjør vi!! + components: + - administrasjon_personal + - utdanning_elev +``` +### Adapter .yaml example file: ```yaml apiVersion: fintlabs.no/v1alpha1 -kind: FintClient +kind: FintAdapter metadata: - name: frodes-test-client + name: flais-test-adapter namespace: fintlabs-no labels: app.kubernetes.io/name: test-adapter - app.kubernetes.io/instance: test-adapter_rogfk_no + app.kubernetes.io/instance: test-adapter_county_no app.kubernetes.io/version: latest app.kubernetes.io/component: adapter + app.kubernetes.io/component: arkiv-adapter app.kubernetes.io/part-of: arkiv fintlabs.no/team: flais fintlabs.no/org-id: fintlabs.no - + spec: orgId: fintlabs.no note: Dette er en test. Nu kjør vi!! components: - administrasjon_personal - utdanning_elev + assetIds: + - test.fylke.no + - test.annet_fylke.no ``` diff --git a/build.gradle b/build.gradle index 867b409..c404ce7 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.7.16' - id 'io.spring.dependency-management' version '1.1.3' + id 'org.springframework.boot' version '2.7.18' + id 'io.spring.dependency-management' version '1.1.7' id 'java' } diff --git a/examples/fint-adapter.yaml b/examples/fint-adapter.yaml index a41dcbd..fcf5904 100644 --- a/examples/fint-adapter.yaml +++ b/examples/fint-adapter.yaml @@ -1,16 +1,16 @@ apiVersion: fintlabs.no/v1alpha1 kind: FintAdapter metadata: - name: sondres-test-adapter + name: test-adapter namespace: fintlabs-no labels: app.kubernetes.io/name: test-adapter - app.kubernetes.io/instance: test-adapter_rogfk_no + app.kubernetes.io/instance: test-adapter_flais_no app.kubernetes.io/version: latest app.kubernetes.io/component: adapter - app.kubernetes.io/part-of: arkiv + app.kubernetes.io/part-of: internal fintlabs.no/team: flais - fintlabs.no/org-id: fintlabs.no + fintlabs.no/org-id: fintlabs-no spec: orgId: fintlabs.no @@ -18,4 +18,8 @@ spec: components: - administrasjon_personal - utdanning_elev + assetIds: + - fylkesting_viken_no + - fylkesting_rogfk_no + - fylkesting_flais_no diff --git a/examples/fint-adapter2.yaml b/examples/fint-adapter2.yaml index 410abad..9171d62 100644 --- a/examples/fint-adapter2.yaml +++ b/examples/fint-adapter2.yaml @@ -1,16 +1,16 @@ apiVersion: fintlabs.no/v1alpha1 kind: FintAdapter metadata: - name: test-adapter + name: testadapter namespace: fintlabs-no labels: app.kubernetes.io/name: test-adapter - app.kubernetes.io/instance: test-adapter_rogfk_no + app.kubernetes.io/instance: test-adapter_flais_no app.kubernetes.io/version: latest app.kubernetes.io/component: adapter - app.kubernetes.io/part-of: arkiv + app.kubernetes.io/part-of: internal fintlabs.no/team: flais - fintlabs.no/org-id: fintlabs.no + fintlabs.no/org-id: fintlabs-no spec: orgId: fintlabs.no @@ -19,8 +19,9 @@ spec: - administrasjon_personal - utdanning_elev assets: - - fylkesting.fintlabs.no + - fylkesting.viken.no + - fylkesting.telemark.no # - frad.fintlabs.no # assetIds: "org,asset,asset" -# fintAdapterIDs: "ou=viken_no,ou=assets,ou=viken_no,ou=organisations,o=fint" \ No newline at end of file +# fintAdapterIDs: "ou=viken_no,ou=assets,ou=viken_no,ou=organisations,o=fint" diff --git a/examples/fint-client.yaml b/examples/fint-client.yaml index e200f42..1522bbf 100644 --- a/examples/fint-client.yaml +++ b/examples/fint-client.yaml @@ -1,20 +1,20 @@ apiVersion: fintlabs.no/v1alpha1 kind: FintClient metadata: - name: frodes-test-client + name: flais-test-client namespace: fintlabs-no labels: app.kubernetes.io/name: test-adapter - app.kubernetes.io/instance: test-adapter_rogfk_no + app.kubernetes.io/instance: test-adapter_flais_no app.kubernetes.io/version: latest app.kubernetes.io/component: adapter - app.kubernetes.io/part-of: arkiv + app.kubernetes.io/part-of: internal fintlabs.no/team: flais - fintlabs.no/org-id: fintlabs.no + fintlabs.no/org-id: fintlabs-no spec: orgId: fintlabs.no - note: Dette er en test. Jævlar, nu kjør vi!! + note: Dette er en test. Nu kjör vi!! components: - administrasjon_personal - utdanning_elev diff --git a/kustomize/base/fintadapters.fintlabs.no-v1.yml b/kustomize/base/fintadapters.fintlabs.no-v1.yml index 2c634ed..0fe1cdf 100644 --- a/kustomize/base/fintadapters.fintlabs.no-v1.yml +++ b/kustomize/base/fintadapters.fintlabs.no-v1.yml @@ -25,6 +25,10 @@ spec: items: type: string type: array + assetIds: + items: + type: string + type: array type: object status: properties: diff --git a/kustomize/overlays/alpha/exclude-kafka.yaml b/kustomize/overlays/alpha/exclude-kafka.yaml new file mode 100644 index 0000000..7b4438f --- /dev/null +++ b/kustomize/overlays/alpha/exclude-kafka.yaml @@ -0,0 +1,10 @@ +$patch: delete +apiVersion: "fintlabs.no/v1alpha1" +kind: KafkaUserAndAcl +metadata: + name: finterator +specs: + acls: + - permission: admin + topic: 'flais-io.fint-customer-objects.*' + diff --git a/kustomize/overlays/alpha/kustomization.yaml b/kustomize/overlays/alpha/kustomization.yaml index bed81a1..0d20b8c 100644 --- a/kustomize/overlays/alpha/kustomization.yaml +++ b/kustomize/overlays/alpha/kustomization.yaml @@ -3,10 +3,23 @@ kind: Kustomization resources: - ../../base patches: + - path: exclude-kafka.yaml + target: + kind: Deployment + name: finterator - patch: |- - op: replace path: "/spec/itemPath" value: "vaults/aks-alpha-vault/items/finterator" target: kind: OnePasswordItem - name: finterator \ No newline at end of file + name: finterator + - patch: |- + - op: add + path: "/spec/template/spec/containers/0/env/-" + value: + name: fint.application-id + value: finterator-alpha + target: + kind: Deployment + name: finterator diff --git a/src/main/java/no/fintlabs/LdapNameGeneratorUtil.java b/src/main/java/no/fintlabs/LdapNameGeneratorUtil.java new file mode 100644 index 0000000..c6f511e --- /dev/null +++ b/src/main/java/no/fintlabs/LdapNameGeneratorUtil.java @@ -0,0 +1,60 @@ +package no.fintlabs; + +import org.apache.commons.lang3.RandomStringUtils; + +public class LdapNameGeneratorUtil { + + public static final int RANDOM_CHARS = 5; + public static final int MAX_LDAP_CHARS = 64; + + public static String generate(String crdName, String orgId, String type) { + + String randomString = RandomStringUtils.randomAlphabetic(RANDOM_CHARS).toLowerCase(); + + if (getFullNameLength(crdName, randomString, orgId, type) > MAX_LDAP_CHARS && crdName.contains("-no-")) { + crdName = crdName.replace("-no-", "-"); + } + + if (getFullNameLength(crdName, randomString, orgId, type) > MAX_LDAP_CHARS && crdName.endsWith("-no")) { + crdName = crdName.substring(0, crdName.length() - 3); + } + + if (getFullNameLength(crdName, randomString, orgId, type) > MAX_LDAP_CHARS && crdName.contains("fylke")) { + crdName = crdName.replace("fylke", ""); + } + + while (getFullNameLength(crdName, randomString, orgId, type) > MAX_LDAP_CHARS) { + crdName = removeCharacterFromLongestPart(crdName); + } + + return String.format("%s-%s", crdName, randomString); + } + + private static String removeCharacterFromLongestPart(String crdName) { + String[] parts = crdName.split("-"); + int longestPartIndex = -1; + int longestPartLength = 0; + + for (int i = 0; i < parts.length; i++) { + if (parts[i].length() >= longestPartLength) { + longestPartLength = parts[i].length(); + longestPartIndex = i; + } + } + + if (longestPartIndex != -1 && parts[longestPartIndex].length() > 0) { + parts[longestPartIndex] = parts[longestPartIndex].substring(0, parts[longestPartIndex].length() - 1); + } + + return String.join("-", parts); + } + + public static int getFullNameLength(String crdName, String randomString, String orgId, String type) { + return generateFullName(crdName, randomString, orgId, type).length(); + } + + public static String generateFullName(String crdName, String randomString, String orgId, String type) { + return String.format("%s-%s@%s.%s", crdName, randomString, type, orgId); + } + +} diff --git a/src/main/java/no/fintlabs/adapter/Adapter.java b/src/main/java/no/fintlabs/adapter/Adapter.java index 4ba2a74..4b7c93b 100644 --- a/src/main/java/no/fintlabs/adapter/Adapter.java +++ b/src/main/java/no/fintlabs/adapter/Adapter.java @@ -60,6 +60,26 @@ public final class Adapter implements Serializable { @Builder.Default private List accessPackages = new ArrayList<>(); + public void addAssets(String assetDn) { + if (assets.stream().noneMatch(assetDn::equalsIgnoreCase)) { + assets.add(assetDn); + } + } + + public void removeAssets(String assetDn) { + assets.removeIf(assetId -> assetId.equalsIgnoreCase(assetDn)); + } + + public void addAssetId(String assetIdDn) { + if (assetIds.stream().noneMatch(assetIdDn::equalsIgnoreCase)) { + assetIds.add(assetIdDn); + } + } + + public void removeAssetId(String assetIdDn) { + assetIds.removeIf(assetId -> assetId.equalsIgnoreCase(assetIdDn)); + } + public void addComponent(String componentDn) { if (components.stream().noneMatch(componentDn::equalsIgnoreCase)) { components.add(componentDn); diff --git a/src/main/java/no/fintlabs/adapter/FintAdapterDependentResource.java b/src/main/java/no/fintlabs/adapter/FintAdapterDependentResource.java index 5f3432a..daded49 100644 --- a/src/main/java/no/fintlabs/adapter/FintAdapterDependentResource.java +++ b/src/main/java/no/fintlabs/adapter/FintAdapterDependentResource.java @@ -6,11 +6,10 @@ import io.javaoperatorsdk.operator.processing.dependent.Updater; import lombok.extern.slf4j.Slf4j; import no.fintlabs.FlaisExternalDependentResource; +import no.fintlabs.LdapNameGeneratorUtil; import no.fintlabs.SecretService; -import no.fintlabs.client.Client; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.SerializationUtils; -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -60,7 +59,7 @@ public Adapter desired(FintAdapterCrd primary, Context context) private Supplier handleDesiredOnNew(FintAdapterCrd primary) { return () -> { - String adapterName = String.format("%s-%s", primary.getMetadata().getName(), RandomStringUtils.randomAlphabetic(5).toLowerCase()); + String adapterName = LdapNameGeneratorUtil.generate(primary.getMetadata().getName(), primary.getSpec().getOrgId(), "adapter"); Adapter adapter = Adapter .builder() .name(adapterName) @@ -71,6 +70,8 @@ private Supplier handleDesiredOnNew(FintAdapterCrd primary) { .build(); primary.getSpec().getComponents() .forEach(component -> adapter.addComponent(String.format("ou=%s,ou=components,o=fint", component))); + primary.getSpec().getAssets() + .forEach(adapter::addAssetId); log.info("No adapter found in event store. Desired adapter is: {}", adapter); return adapter; @@ -88,10 +89,15 @@ private Function handleDesiredForExisting(FintAdapterCrd prima Adapter desiredAdapter = SerializationUtils.clone(currentAdapter); desiredAdapter.setNote(generateNote(primary)); desiredAdapter.getComponents().clear(); + desiredAdapter.getAssets().clear(); desiredAdapter.setManaged(true); primary.getSpec().getComponents() .forEach(component -> desiredAdapter.addComponent(String.format("ou=%s,ou=components,o=fint", component))); + String orgId = primary.getSpec().getOrgId().replace(".","-"); + primary.getSpec().getAssets() + .forEach(asset -> desiredAdapter.addAssets(String.format("ou=%s,ou=assets,ou=%s,ou=organisations,o=fint", asset.replace(".","_"), orgId))); + return desiredAdapter; }; } @@ -122,20 +128,7 @@ public Adapter create(Adapter desired, FintAdapterCrd primary, Context fetchResources(FintAdapterCrd primaryResource) { - Set adapters = fintAdapterRepository.get(primaryResource); - - for (var adapter : adapters) { - if (isSecretOrPasswordMissing(adapter)) { - adapter.setNote("Trigger update because clientSecret or password is empty"); - log.info("Change adapter '{}' to trigger update", adapter.getName()); - } - } - - return adapters; - } - - private boolean isSecretOrPasswordMissing(Adapter adapter) { - return /*adapter.isManaged() &&*/ (StringUtils.isEmpty(adapter.getClientSecret()) || StringUtils.isEmpty(adapter.getPassword())); + return fintAdapterRepository.get(primaryResource); } @Override diff --git a/src/main/java/no/fintlabs/adapter/FintAdapterSpec.java b/src/main/java/no/fintlabs/adapter/FintAdapterSpec.java index bb825ff..9bd1c9f 100644 --- a/src/main/java/no/fintlabs/adapter/FintAdapterSpec.java +++ b/src/main/java/no/fintlabs/adapter/FintAdapterSpec.java @@ -16,5 +16,6 @@ public class FintAdapterSpec implements FlaisSpec { private String orgId; private String note; private List components = Collections.emptyList(); + private List assets = Collections.emptyList(); } diff --git a/src/test/java/no/fintlabs/LdapNameGeneratorUtilTest.java b/src/test/java/no/fintlabs/LdapNameGeneratorUtilTest.java new file mode 100644 index 0000000..145e9e6 --- /dev/null +++ b/src/test/java/no/fintlabs/LdapNameGeneratorUtilTest.java @@ -0,0 +1,91 @@ +package no.fintlabs; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Assertions; + +public class LdapNameGeneratorUtilTest { + @Test + void generateNormal() { + String crdName = "drosjeloyve"; + String orgId = "agderfk.no"; + String type = "client"; + + String result = LdapNameGeneratorUtil.generate(crdName, orgId, type); + + Assertions.assertEquals( "drosjeloyve", result.substring(0, result.length() - 6)); + System.out.println(result); + } + + @Test + void generateRemovalOfNo() { + String crdName = "drosjeloyve-beta-trondelagfylke-no"; + String orgId = "trondelagfylke.no"; + String type = "client"; + + String result = LdapNameGeneratorUtil.generate(crdName, orgId, type); + + Assertions.assertEquals( "drosjeloyve-beta-trondelagfylke", result.substring(0, result.length() - 6)); + System.out.println(result); + } + + @Test + void generateRemovalOfFylke() { + String crdName = "drosjeloyve-beta-test-trondelagfylke-no"; + String orgId = "trondelagfylke.no"; + String type = "client"; + + String result = LdapNameGeneratorUtil.generate(crdName, orgId, type); + + Assertions.assertEquals( "drosjeloyve-beta-test-trondelag", result.substring(0, result.length() - 6)); + System.out.println(result); + } + + @Test + void generateRemovalOfLongestPart() { + String crdName = "drosjeloyve-beta-trondelag-test1-t"; + String orgId = "trondelagfylke.no"; + String type = "client"; + + String result = LdapNameGeneratorUtil.generate(crdName, orgId, type); + + Assertions.assertEquals( "drosjeloyv-beta-trondelag-test1-t", result.substring(0, result.length() - 6)); + System.out.println(result); + } + + @Test + void generateRemovalOfLongestPart2() { + String crdName = "drosjeloyve-beta-trondelag-test1-tes"; + String orgId = "trondelagfylke.no"; + String type = "client"; + + String result = LdapNameGeneratorUtil.generate(crdName, orgId, type); + + Assertions.assertEquals( "drosjeloy-beta-trondela-test1-tes", result.substring(0, result.length() - 6)); + System.out.println(result); + } + + @Test + void generateRemovalOfLongestPart3() { + String crdName = "drosjeloyve-beta-trondelag-test1-tes-test"; + String orgId = "trondelagfylke.no"; + String type = "client"; + + String result = LdapNameGeneratorUtil.generate(crdName, orgId, type); + + Assertions.assertEquals( "drosje-beta-tronde-test1-tes-test", result.substring(0, result.length() - 6)); + System.out.println(result); + } + + @Test + void generateFullName() { + String crdName = "drosjeloyve-beta-trondelagfylke-no"; + String randomString = "wayzk"; + String orgId = "trondelagfylke.no"; + String type = "client"; + + String result = LdapNameGeneratorUtil.generateFullName(crdName, randomString, orgId, type); + + Assertions.assertEquals("drosjeloyve-beta-trondelagfylke-no-wayzk@client.trondelagfylke.no", result); + System.out.println(result); + } +} diff --git a/src/test/java/no/fintlabs/adapter/AdapterTest.java b/src/test/java/no/fintlabs/adapter/AdapterTest.java new file mode 100644 index 0000000..4de4814 --- /dev/null +++ b/src/test/java/no/fintlabs/adapter/AdapterTest.java @@ -0,0 +1,66 @@ +package no.fintlabs.adapter; + +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; + +import static org.junit.jupiter.api.Assertions.*; + +class AdapterTest { + @Test + public void testAddAssetIdNotInList() { + Adapter adapter = testAdapter(); + adapter.addAssetId("asset1"); + assertTrue(adapter.getAssetIds().contains("asset1")); + } + + @Test + public void testAddAssetIdAlreadyInList() { + Adapter adapter = testAdapter(); + adapter.addAssetId("asset1"); + adapter.addAssetId("asset1"); + assertEquals(1, adapter.getAssetIds().size()); + } + + @Test + public void testAddComponentWhenListIsEmpty() { + Adapter adapter = testAdapter(); + adapter.addComponent("component1"); + assertTrue(adapter.getComponents().contains("component1")); + assertEquals(1, adapter.getComponents().size()); + } + + @Test + public void testAddComponentWhenComponentDoesNotExist() { + Adapter adapter = testAdapter(); + adapter.addComponent("component1"); + assertEquals(1,adapter.getComponents().size()); + assertEquals("component1",adapter.getComponents().get(0)); + } + + @Test + public void testAddComponentWhenComponentExists() { + Adapter adapter = testAdapter(); + adapter.addComponent("component1"); + adapter.addComponent("component1"); + + assertEquals(1,adapter.getComponents().size()); + } + + private static Adapter testAdapter() { + return new Adapter( + "", + "", + false, + "", + new ArrayList<>(), + new ArrayList<>(), + "", + "", + "", + "", + "", + new ArrayList<>(), + new ArrayList<>()); + } +} diff --git a/src/test/java/no/fintlabs/adapter/FintAdapterDependentResourceTest.java b/src/test/java/no/fintlabs/adapter/FintAdapterDependentResourceTest.java new file mode 100644 index 0000000..1f6e509 --- /dev/null +++ b/src/test/java/no/fintlabs/adapter/FintAdapterDependentResourceTest.java @@ -0,0 +1,89 @@ +package no.fintlabs.adapter; + +import io.fabric8.kubernetes.api.model.ObjectMeta; +import no.fintlabs.SecretService; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; +import java.util.ArrayList; +import java.lang.reflect.Method; +import java.util.function.Function; + +import static org.mockito.Mockito.mock; + +@ExtendWith(MockitoExtension.class) +public class FintAdapterDependentResourceTest { + @Test + public void testHandleDesiredForExisting() { + FintAdapterCrd primary = new FintAdapterCrd(); + Adapter currentAdapter = currentAdapter(); + Adapter desiredAdapter = desiredAdapter(); + primary.setMetadata(new ObjectMeta()); + System.out.println("Primary: " + primary); + + try { + FintAdapterDependentResource fintAdapterDependentResource = new FintAdapterDependentResource(new FintAdapterWorkflow(), mock(FintAdapterRepository.class), new SecretService()); + Method privateMethod = FintAdapterDependentResource.class.getDeclaredMethod("handleDesiredForExisting", FintAdapterCrd.class); + privateMethod.setAccessible(true); + Object function = privateMethod.invoke(fintAdapterDependentResource, primary); + Function handleDesiredForExisting = (Function) function; desiredAdapter = handleDesiredForExisting.apply(currentAdapter); + Assertions.assertNotEquals(currentAdapter, desiredAdapter); + Assertions.assertTrue(desiredAdapter.getComponents().isEmpty()); + Assertions.assertTrue(desiredAdapter.getAssetIds().isEmpty()); + Assertions.assertTrue(desiredAdapter.isManaged()); + } catch (Exception e) { + System.out.println("Error occured during test: " + e.getMessage()); + } + System.out.println("currentAdapter: " + currentAdapter); + System.out.println("desiredAdapter: " + desiredAdapter); + } + + @Test + public void testGenerateNote_regularCase() { + FintAdapterCrd primary = new FintAdapterCrd(); + FintAdapterSpec spec = new FintAdapterSpec(); + spec.setNote("Test note"); + primary.setSpec(spec); + String applicationId = "TESTAPP"; + String result = generateNote(primary, applicationId); + Assertions.assertEquals("Test note\n\nDenne adapteren er automatisk opprettet og håndteres av TESTAPP", result); + } + + private String generateNote(FintAdapterCrd primary, String applicationId) { + return String.format("%s\n\n%s%s", primary.getSpec().getNote(), "Denne adapteren er automatisk opprettet og håndteres av ", applicationId.toUpperCase()); + } + + private static Adapter currentAdapter() { + return new Adapter( + "dn", + "current", + false, + "shortDescription", + new ArrayList<>(), + new ArrayList<>(), + "note", + "password", + "secret", + "publicKey", + "clientId", + new ArrayList<>(), + new ArrayList<>()); + } + private static Adapter desiredAdapter() { + return new Adapter( + "dn", + "desired", + false, + "shortDescription", + new ArrayList<>(), + new ArrayList<>(), + "note", + "password", + "secret", + "publicKey", + "clientId", + new ArrayList<>(), + new ArrayList<>()); + } +}