From 12ff636b2b17eaacb28067ea86f7bd4db6a1ce1b Mon Sep 17 00:00:00 2001 From: Sondre Nordjore Date: Tue, 10 Oct 2023 15:46:40 +0200 Subject: [PATCH 01/18] Now supports assetIds --- examples/fint-adapter.yaml | 6 +++++- examples/fint-client.yaml | 2 +- kustomize/base/fintadapters.fintlabs.no-v1.yml | 4 ++++ src/main/java/no/fintlabs/adapter/Adapter.java | 10 ++++++++++ .../fintlabs/adapter/FintAdapterDependentResource.java | 9 +++++++++ src/main/java/no/fintlabs/adapter/FintAdapterSpec.java | 1 + 6 files changed, 30 insertions(+), 2 deletions(-) diff --git a/examples/fint-adapter.yaml b/examples/fint-adapter.yaml index a41dcbd..c37b6a6 100644 --- a/examples/fint-adapter.yaml +++ b/examples/fint-adapter.yaml @@ -1,7 +1,7 @@ apiVersion: fintlabs.no/v1alpha1 kind: FintAdapter metadata: - name: sondres-test-adapter + name: test-adapter-2 namespace: fintlabs-no labels: app.kubernetes.io/name: test-adapter @@ -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-client.yaml b/examples/fint-client.yaml index e200f42..60879b6 100644 --- a/examples/fint-client.yaml +++ b/examples/fint-client.yaml @@ -1,7 +1,7 @@ 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 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/src/main/java/no/fintlabs/adapter/Adapter.java b/src/main/java/no/fintlabs/adapter/Adapter.java index 4ba2a74..6d9bfa5 100644 --- a/src/main/java/no/fintlabs/adapter/Adapter.java +++ b/src/main/java/no/fintlabs/adapter/Adapter.java @@ -60,6 +60,16 @@ public final class Adapter implements Serializable { @Builder.Default private List accessPackages = new ArrayList<>(); + public void addAssetId(String assetDn) { + if (assetIds.stream().noneMatch(assetDn::equalsIgnoreCase)) { + assetIds.add(assetDn); + } + } + + public void removeAssetId(String assetDn) { + assetIds.removeIf(assetId -> assetId.equalsIgnoreCase(assetDn)); + } + 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 7bebf7d..0bb9043 100644 --- a/src/main/java/no/fintlabs/adapter/FintAdapterDependentResource.java +++ b/src/main/java/no/fintlabs/adapter/FintAdapterDependentResource.java @@ -69,6 +69,10 @@ private Supplier handleDesiredOnNew(FintAdapterCrd primary) { .build(); primary.getSpec().getComponents() .forEach(component -> adapter.addComponent(String.format("ou=%s,ou=components,o=fint", component))); + + String orgId = primary.getSpec().getOrgId().replace(".","_"); + primary.getSpec().getAssetIds() + .forEach(assetId -> adapter.addAssetId(String.format("ou=%s,ou=assets,ou=%s,ou=organisations,o=fint", assetId, orgId))); log.info("No adapter found in event store. Desired adapter is: {}", adapter); return adapter; @@ -86,10 +90,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().getAssetIds() + .forEach(asset -> desiredAdapter.addAssetId(String.format("ou=%s,ou=assets,ou=%s,ou=organisations,o=fint", asset.replace(".","_"), orgId))); + return desiredAdapter; }; } diff --git a/src/main/java/no/fintlabs/adapter/FintAdapterSpec.java b/src/main/java/no/fintlabs/adapter/FintAdapterSpec.java index bb825ff..b0bfeaf 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 assetIds = Collections.emptyList(); } From ed923a996758bf33915f20ebdc2b4c0ab34cee70 Mon Sep 17 00:00:00 2001 From: Sondre Nordjore Date: Thu, 12 Oct 2023 15:14:57 +0200 Subject: [PATCH 02/18] WIP | Changing assetIds to assets --- examples/fint-adapter.yaml | 2 +- kustomize/base/fintadapters.fintlabs.no-v1.yml | 2 +- src/main/java/no/fintlabs/adapter/Adapter.java | 10 +++++----- .../fintlabs/adapter/FintAdapterDependentResource.java | 8 ++++---- src/main/java/no/fintlabs/adapter/FintAdapterSpec.java | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/examples/fint-adapter.yaml b/examples/fint-adapter.yaml index c37b6a6..f27ab7b 100644 --- a/examples/fint-adapter.yaml +++ b/examples/fint-adapter.yaml @@ -1,7 +1,7 @@ apiVersion: fintlabs.no/v1alpha1 kind: FintAdapter metadata: - name: test-adapter-2 + name: test-adapter namespace: fintlabs-no labels: app.kubernetes.io/name: test-adapter diff --git a/kustomize/base/fintadapters.fintlabs.no-v1.yml b/kustomize/base/fintadapters.fintlabs.no-v1.yml index 0fe1cdf..e8075c0 100644 --- a/kustomize/base/fintadapters.fintlabs.no-v1.yml +++ b/kustomize/base/fintadapters.fintlabs.no-v1.yml @@ -25,7 +25,7 @@ spec: items: type: string type: array - assetIds: + assets: items: type: string type: array diff --git a/src/main/java/no/fintlabs/adapter/Adapter.java b/src/main/java/no/fintlabs/adapter/Adapter.java index 6d9bfa5..80bfc5c 100644 --- a/src/main/java/no/fintlabs/adapter/Adapter.java +++ b/src/main/java/no/fintlabs/adapter/Adapter.java @@ -60,14 +60,14 @@ public final class Adapter implements Serializable { @Builder.Default private List accessPackages = new ArrayList<>(); - public void addAssetId(String assetDn) { - if (assetIds.stream().noneMatch(assetDn::equalsIgnoreCase)) { - assetIds.add(assetDn); + public void addAssets(String assetDn) { + if (assets.stream().noneMatch(assetDn::equalsIgnoreCase)) { + assets.add(assetDn); } } - public void removeAssetId(String assetDn) { - assetIds.removeIf(assetId -> assetId.equalsIgnoreCase(assetDn)); + public void removeAssets(String assetDn) { + assets.removeIf(assetId -> assetId.equalsIgnoreCase(assetDn)); } public void addComponent(String componentDn) { diff --git a/src/main/java/no/fintlabs/adapter/FintAdapterDependentResource.java b/src/main/java/no/fintlabs/adapter/FintAdapterDependentResource.java index 0bb9043..f2f77a8 100644 --- a/src/main/java/no/fintlabs/adapter/FintAdapterDependentResource.java +++ b/src/main/java/no/fintlabs/adapter/FintAdapterDependentResource.java @@ -71,8 +71,8 @@ private Supplier handleDesiredOnNew(FintAdapterCrd primary) { .forEach(component -> adapter.addComponent(String.format("ou=%s,ou=components,o=fint", component))); String orgId = primary.getSpec().getOrgId().replace(".","_"); - primary.getSpec().getAssetIds() - .forEach(assetId -> adapter.addAssetId(String.format("ou=%s,ou=assets,ou=%s,ou=organisations,o=fint", assetId, orgId))); + primary.getSpec().getAssets() + .forEach(asset -> adapter.addAssets(String.format("ou=%s,ou=assets,ou=%s,ou=organisations,o=fint", asset.replace(".","_"), orgId))); log.info("No adapter found in event store. Desired adapter is: {}", adapter); return adapter; @@ -96,8 +96,8 @@ private Function handleDesiredForExisting(FintAdapterCrd prima .forEach(component -> desiredAdapter.addComponent(String.format("ou=%s,ou=components,o=fint", component))); String orgId = primary.getSpec().getOrgId().replace(".","_"); - primary.getSpec().getAssetIds() - .forEach(asset -> desiredAdapter.addAssetId(String.format("ou=%s,ou=assets,ou=%s,ou=organisations,o=fint", asset.replace(".","_"), orgId))); + primary.getSpec().getAssets() + .forEach(asset -> desiredAdapter.addAssets(String.format("ou=%s,ou=assets,ou=%s,ou=organisations,o=fint", asset.replace(".","_"), orgId))); return desiredAdapter; }; diff --git a/src/main/java/no/fintlabs/adapter/FintAdapterSpec.java b/src/main/java/no/fintlabs/adapter/FintAdapterSpec.java index b0bfeaf..9bd1c9f 100644 --- a/src/main/java/no/fintlabs/adapter/FintAdapterSpec.java +++ b/src/main/java/no/fintlabs/adapter/FintAdapterSpec.java @@ -16,6 +16,6 @@ public class FintAdapterSpec implements FlaisSpec { private String orgId; private String note; private List components = Collections.emptyList(); - private List assetIds = Collections.emptyList(); + private List assets = Collections.emptyList(); } From 49fe0203b6d87c75195fb56950516b3ad98a170a Mon Sep 17 00:00:00 2001 From: Trond Magnus Sevre Date: Mon, 30 Oct 2023 14:47:49 +0100 Subject: [PATCH 03/18] Remove update-trigger and overwrite isManaged in match --- .github/workflows/build-and-deploy.yaml | 56 +++++++++---------- .../adapter/FintAdapterDependentResource.java | 25 +++------ .../adapter/FintAdapterReconciler.java | 16 +++++- .../client/FintClientDependentResource.java | 23 +++----- .../fintlabs/client/FintClientReconiler.java | 16 +++++- .../FintClientSecretDependentResource.java | 9 ++- 6 files changed, 77 insertions(+), 68 deletions(-) diff --git a/.github/workflows/build-and-deploy.yaml b/.github/workflows/build-and-deploy.yaml index 3ad2a92..22dcb0e 100644 --- a/.github/workflows/build-and-deploy.yaml +++ b/.github/workflows/build-and-deploy.yaml @@ -110,31 +110,31 @@ jobs: namespace: operators action: deploy - ## Beta cluster ## - - name: Bake beta manifests with Kustomize - uses: azure/k8s-bake@v2 - with: - renderEngine: 'kustomize' - kustomizationPath: 'kustomize/overlays/beta' - id: bake-beta - - - uses: azure/login@v1 - with: - creds: '${{ secrets.AKS_BETA_FINT_GITHUB }}' - - - name: Set the target Beta cluster. - uses: azure/aks-set-context@v3 - with: - cluster-name: ${{ env.BETA_CLUSTER_NAME }} - resource-group: ${{ env.BETA_CLUSTER_RESOURCE_GROUP }} - admin: 'true' - use-kubelogin: 'true' - - - name: Deploy to Beta - uses: azure/k8s-deploy@v4.9 - with: - manifests: ${{ steps.bake-beta.outputs.manifestsBundle }} - images: | - ${{ steps.meta.outputs.tags }} - namespace: operators - action: deploy \ No newline at end of file +# ## Beta cluster ## +# - name: Bake beta manifests with Kustomize +# uses: azure/k8s-bake@v2 +# with: +# renderEngine: 'kustomize' +# kustomizationPath: 'kustomize/overlays/beta' +# id: bake-beta +# +# - uses: azure/login@v1 +# with: +# creds: '${{ secrets.AKS_BETA_FINT_GITHUB }}' +# +# - name: Set the target Beta cluster. +# uses: azure/aks-set-context@v3 +# with: +# cluster-name: ${{ env.BETA_CLUSTER_NAME }} +# resource-group: ${{ env.BETA_CLUSTER_RESOURCE_GROUP }} +# admin: 'true' +# use-kubelogin: 'true' +# +# - name: Deploy to Beta +# uses: azure/k8s-deploy@v4.9 +# with: +# manifests: ${{ steps.bake-beta.outputs.manifestsBundle }} +# images: | +# ${{ steps.meta.outputs.tags }} +# namespace: operators +# action: deploy \ No newline at end of file diff --git a/src/main/java/no/fintlabs/adapter/FintAdapterDependentResource.java b/src/main/java/no/fintlabs/adapter/FintAdapterDependentResource.java index 5f3432a..682a49f 100644 --- a/src/main/java/no/fintlabs/adapter/FintAdapterDependentResource.java +++ b/src/main/java/no/fintlabs/adapter/FintAdapterDependentResource.java @@ -7,10 +7,8 @@ import lombok.extern.slf4j.Slf4j; import no.fintlabs.FlaisExternalDependentResource; 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; @@ -122,29 +120,20 @@ 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 public Matcher.Result match( Adapter actualResource, FintAdapterCrd primary, Context context ) { - DesiredEqualsMatcher matcher = new DesiredEqualsMatcher<>(this); + // TODO: 27/10/2023 Finn ut hvorfor managed blir false + actualResource.setManaged(true); - return matcher.match(actualResource, primary, context); + DesiredEqualsMatcher matcher = new DesiredEqualsMatcher<>(this); + Matcher.Result result = matcher.match(actualResource, primary, context); + log.debug("Match {} ={}", primary.getMetadata().getName(), result.matched()); + return result; } } diff --git a/src/main/java/no/fintlabs/adapter/FintAdapterReconciler.java b/src/main/java/no/fintlabs/adapter/FintAdapterReconciler.java index 3dacd4b..e92ab3a 100644 --- a/src/main/java/no/fintlabs/adapter/FintAdapterReconciler.java +++ b/src/main/java/no/fintlabs/adapter/FintAdapterReconciler.java @@ -25,6 +25,20 @@ public FintAdapterReconciler( @Override public UpdateControl reconcile(FintAdapterCrd resource, Context context) { - return super.reconcile(resource, context); + //return super.reconcile(resource, context); + + String name = resource.getMetadata().getName(); + String namespace = resource.getMetadata().getNamespace(); + + String acceptedName = "frode"; + String acceptedNamespace = "fintlabs-no"; + + if (name.contains(acceptedName) && namespace.contains(acceptedNamespace)) { + log.info("Include update for " + name + " in " + namespace); + return super.reconcile(resource, context); + } else { + log.info("Skip update for " + name + " in " + namespace); + return UpdateControl.noUpdate(); + } } } diff --git a/src/main/java/no/fintlabs/client/FintClientDependentResource.java b/src/main/java/no/fintlabs/client/FintClientDependentResource.java index 4ec7333..3dc623f 100644 --- a/src/main/java/no/fintlabs/client/FintClientDependentResource.java +++ b/src/main/java/no/fintlabs/client/FintClientDependentResource.java @@ -5,6 +5,7 @@ import io.javaoperatorsdk.operator.processing.dependent.Matcher; import io.javaoperatorsdk.operator.processing.dependent.Updater; import lombok.extern.slf4j.Slf4j; +import no.fintlabs.CustomerObjectResponseException; import no.fintlabs.FlaisExternalDependentResource; import no.fintlabs.SecretService; import org.apache.commons.lang3.RandomStringUtils; @@ -124,26 +125,18 @@ public Client create(Client desired, FintClientCrd primary, Context fetchResources(FintClientCrd primaryResource) { - Set clients = fintClientRepository.get(primaryResource); - - for (var client : clients) { - if (isSecretOrPasswordMissing(client)) { - client.setNote("Trigger update because clientSecret or password is empty"); - log.info("Change client '{}' to trigger update", client.getName()); - } - } - - return clients; - } - - private boolean isSecretOrPasswordMissing(Client client) { - return /*client.isManaged() &&*/ (StringUtils.isEmpty(client.getClientSecret()) || StringUtils.isEmpty(client.getPassword())); + return fintClientRepository.get(primaryResource); } @Override public Matcher.Result match(Client actualResource, FintClientCrd primary, Context context) { + // TODO: 27/10/2023 Finn ut hvorfor managed blir false + actualResource.setManaged(true); + DesiredEqualsMatcher matcher = new DesiredEqualsMatcher<>(this); - return matcher.match(actualResource, primary, context); + Matcher.Result result = matcher.match(actualResource, primary, context); + log.debug("Match {} ={}", primary.getMetadata().getName(), result.matched()); + return result; } } \ No newline at end of file diff --git a/src/main/java/no/fintlabs/client/FintClientReconiler.java b/src/main/java/no/fintlabs/client/FintClientReconiler.java index f714d08..7100989 100644 --- a/src/main/java/no/fintlabs/client/FintClientReconiler.java +++ b/src/main/java/no/fintlabs/client/FintClientReconiler.java @@ -23,7 +23,21 @@ public FintClientReconiler(FintClientWorkflow workflow, @Override public UpdateControl reconcile(FintClientCrd resource, Context context) { - return super.reconcile(resource, context); + //return super.reconcile(resource, context); + + String name = resource.getMetadata().getName(); + String namespace = resource.getMetadata().getNamespace(); + + String acceptedName = "frode"; + String acceptedNamespace = "fintlabs-no"; + + if (name.contains(acceptedName) && namespace.contains(acceptedNamespace)) { + log.info("Include update for " + name + " in " + namespace); + return super.reconcile(resource, context); + } else { + log.info("Skip update for " + name + " in " + namespace); + return UpdateControl.noUpdate(); + } } diff --git a/src/main/java/no/fintlabs/client/FintClientSecretDependentResource.java b/src/main/java/no/fintlabs/client/FintClientSecretDependentResource.java index a1867dd..de782bf 100644 --- a/src/main/java/no/fintlabs/client/FintClientSecretDependentResource.java +++ b/src/main/java/no/fintlabs/client/FintClientSecretDependentResource.java @@ -4,7 +4,11 @@ import io.fabric8.kubernetes.api.model.SecretBuilder; import io.fabric8.kubernetes.client.KubernetesClient; import io.javaoperatorsdk.operator.api.reconciler.Context; +import io.javaoperatorsdk.operator.processing.dependent.Matcher; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.GenericKubernetesResourceMatcher; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent; import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResourceConfig; +import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition; import lombok.extern.slf4j.Slf4j; import no.fintlabs.FlaisKubernetesDependentResource; import no.fintlabs.SecretService; @@ -39,11 +43,9 @@ public FintClientSecretDependentResource(FintClientWorkflow workflow, protected Secret desired(FintClientCrd resource, Context context) { log.debug("Desired secret for {}", resource.getMetadata().getName()); - Client fintClient = context.getSecondaryResource(Client.class).orElseThrow(); HashMap labels = new HashMap<>(resource.getMetadata().getLabels()); - labels.put("app.kubernetes.io/managed-by", "finterator"); return new SecretBuilder() @@ -58,12 +60,9 @@ protected Secret desired(FintClientCrd resource, Context context) .addToData("fint.core.oauth2.client-id", encode((fintClient.getClientId()))) .addToData("fint.core.oauth2.client-secret", encode(secretService.decrypt(fintClient.getClientSecret()))) .build(); - - } public String encode(String value) { - if (value == null) value = ""; return Base64.getEncoder().encodeToString(value.getBytes()); } From 485c49667abd35c163cdcf05a05f5a4c995a07b3 Mon Sep 17 00:00:00 2001 From: Trond Magnus Sevre Date: Tue, 31 Oct 2023 09:55:49 +0100 Subject: [PATCH 04/18] Change reconiler filter into config --- .../fintlabs/adapter/FintAdapterReconciler.java | 16 +++++++++++----- .../no/fintlabs/client/FintClientReconiler.java | 16 ++++++++++------ 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/main/java/no/fintlabs/adapter/FintAdapterReconciler.java b/src/main/java/no/fintlabs/adapter/FintAdapterReconciler.java index e92ab3a..ad3a9cb 100644 --- a/src/main/java/no/fintlabs/adapter/FintAdapterReconciler.java +++ b/src/main/java/no/fintlabs/adapter/FintAdapterReconciler.java @@ -7,7 +7,9 @@ import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource; import lombok.extern.slf4j.Slf4j; import no.fintlabs.FlaisReconiler; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; import java.util.List; @@ -19,10 +21,16 @@ public FintAdapterReconciler( FintAdapterWorkflow workflow, List> eventSourceProviders, List> deleters - ) { + ) { super(workflow, eventSourceProviders, deleters); } + @Value("${fint.accepted.adapter-name:}") + private String acceptedName; + + @Value("${fint.accepted.adapter-namespace:}") + private String acceptedNamespace; + @Override public UpdateControl reconcile(FintAdapterCrd resource, Context context) { //return super.reconcile(resource, context); @@ -30,10 +38,8 @@ public UpdateControl reconcile(FintAdapterCrd resource, Context< String name = resource.getMetadata().getName(); String namespace = resource.getMetadata().getNamespace(); - String acceptedName = "frode"; - String acceptedNamespace = "fintlabs-no"; - - if (name.contains(acceptedName) && namespace.contains(acceptedNamespace)) { + if (name.contains(acceptedName) && namespace.contains(acceptedNamespace) + && StringUtils.hasText(acceptedName) && StringUtils.hasText(acceptedNamespace)) { log.info("Include update for " + name + " in " + namespace); return super.reconcile(resource, context); } else { diff --git a/src/main/java/no/fintlabs/client/FintClientReconiler.java b/src/main/java/no/fintlabs/client/FintClientReconiler.java index 7100989..049835f 100644 --- a/src/main/java/no/fintlabs/client/FintClientReconiler.java +++ b/src/main/java/no/fintlabs/client/FintClientReconiler.java @@ -7,7 +7,9 @@ import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource; import lombok.extern.slf4j.Slf4j; import no.fintlabs.FlaisReconiler; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; import java.util.List; @@ -21,6 +23,12 @@ public FintClientReconiler(FintClientWorkflow workflow, super(workflow, eventSourceProviders, deleters); } + @Value("${fint.accepted.client-name:}") + private String acceptedName; + + @Value("${fint.accepted.client-namespace:}") + private String acceptedNamespace; + @Override public UpdateControl reconcile(FintClientCrd resource, Context context) { //return super.reconcile(resource, context); @@ -28,10 +36,8 @@ public UpdateControl reconcile(FintClientCrd resource, Context reconcile(FintClientCrd resource, Context Date: Tue, 31 Oct 2023 09:58:47 +0100 Subject: [PATCH 05/18] Deploy from branch --- .github/workflows/build-and-deploy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-deploy.yaml b/.github/workflows/build-and-deploy.yaml index 22dcb0e..3a8f60c 100644 --- a/.github/workflows/build-and-deploy.yaml +++ b/.github/workflows/build-and-deploy.yaml @@ -2,7 +2,7 @@ name: Create and publish a Docker image on: push: - branches: ['main'] + branches: ['main', 'try-to-fix'] env: REGISTRY: ghcr.io From 159408f88a0748d1f8136e5267cd7d7bbff2c280 Mon Sep 17 00:00:00 2001 From: Trond Magnus Sevre Date: Tue, 31 Oct 2023 11:54:13 +0100 Subject: [PATCH 06/18] Deploy to beta --- .github/workflows/build-and-deploy.yaml | 56 ++++++++++++------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/.github/workflows/build-and-deploy.yaml b/.github/workflows/build-and-deploy.yaml index 3a8f60c..3330693 100644 --- a/.github/workflows/build-and-deploy.yaml +++ b/.github/workflows/build-and-deploy.yaml @@ -110,31 +110,31 @@ jobs: namespace: operators action: deploy -# ## Beta cluster ## -# - name: Bake beta manifests with Kustomize -# uses: azure/k8s-bake@v2 -# with: -# renderEngine: 'kustomize' -# kustomizationPath: 'kustomize/overlays/beta' -# id: bake-beta -# -# - uses: azure/login@v1 -# with: -# creds: '${{ secrets.AKS_BETA_FINT_GITHUB }}' -# -# - name: Set the target Beta cluster. -# uses: azure/aks-set-context@v3 -# with: -# cluster-name: ${{ env.BETA_CLUSTER_NAME }} -# resource-group: ${{ env.BETA_CLUSTER_RESOURCE_GROUP }} -# admin: 'true' -# use-kubelogin: 'true' -# -# - name: Deploy to Beta -# uses: azure/k8s-deploy@v4.9 -# with: -# manifests: ${{ steps.bake-beta.outputs.manifestsBundle }} -# images: | -# ${{ steps.meta.outputs.tags }} -# namespace: operators -# action: deploy \ No newline at end of file + ## Beta cluster ## + - name: Bake beta manifests with Kustomize + uses: azure/k8s-bake@v2 + with: + renderEngine: 'kustomize' + kustomizationPath: 'kustomize/overlays/beta' + id: bake-beta + + - uses: azure/login@v1 + with: + creds: '${{ secrets.AKS_BETA_FINT_GITHUB }}' + + - name: Set the target Beta cluster. + uses: azure/aks-set-context@v3 + with: + cluster-name: ${{ env.BETA_CLUSTER_NAME }} + resource-group: ${{ env.BETA_CLUSTER_RESOURCE_GROUP }} + admin: 'true' + use-kubelogin: 'true' + + - name: Deploy to Beta + uses: azure/k8s-deploy@v4.9 + with: + manifests: ${{ steps.bake-beta.outputs.manifestsBundle }} + images: | + ${{ steps.meta.outputs.tags }} + namespace: operators + action: deploy \ No newline at end of file From b09920ba0ceb31a92eea9abdd381f97a280d1ec4 Mon Sep 17 00:00:00 2001 From: Trond Magnus Sevre Date: Thu, 23 Nov 2023 14:27:00 +0100 Subject: [PATCH 07/18] Create algorithm that prevents too long names in LDAP --- build.gradle | 3 +- .../no/fintlabs/LdapNameGeneratorUtil.java | 70 ++++++++++ .../adapter/FintAdapterDependentResource.java | 3 +- .../client/FintClientDependentResource.java | 4 +- .../fintlabs/client/FintClientRepository.java | 2 +- .../fintlabs/LdapNameGeneratorUtilTest.java | 131 ++++++++++++++++++ 6 files changed, 209 insertions(+), 4 deletions(-) create mode 100644 src/main/java/no/fintlabs/LdapNameGeneratorUtil.java create mode 100644 src/test/java/no/fintlabs/LdapNameGeneratorUtilTest.java diff --git a/build.gradle b/build.gradle index 867b409..ad52e5c 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,8 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'no.fintlabs:flais-operator-starter:1.0.0' - annotationProcessor 'io.fabric8:crd-generator-apt:6.2.0' + testImplementation 'org.junit.jupiter:junit-jupiter:5.8.1' + annotationProcessor 'io.fabric8:crd-generator-apt:6.2.0' implementation 'org.springframework.kafka:spring-kafka' implementation 'no.fintlabs:fint-kafka:4.0.1' diff --git a/src/main/java/no/fintlabs/LdapNameGeneratorUtil.java b/src/main/java/no/fintlabs/LdapNameGeneratorUtil.java new file mode 100644 index 0000000..bed8de4 --- /dev/null +++ b/src/main/java/no/fintlabs/LdapNameGeneratorUtil.java @@ -0,0 +1,70 @@ +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) { + + // drosjeloyve-beta-trondelagfylke-no-wayzk@client.trondelagfylke.no + // drosjeloyve-beta-trondelagfylke-wayzk@client.trondelagfylke.no + // drosjeloyve-wayzk@client.trondelagfylke.no + + String randomString = RandomStringUtils.randomAlphabetic(RANDOM_CHARS).toLowerCase(); + + // Remove if too long and contains -no- + if (getFullNameLength(crdName, randomString, orgId, type) > MAX_LDAP_CHARS && crdName.contains("-no-")) { + crdName = crdName.replace("-no-", "-"); + } + + // remove if too long and ends with -no + if (getFullNameLength(crdName, randomString, orgId, type) > MAX_LDAP_CHARS && crdName.endsWith("-no")) { + crdName = crdName.substring(0, crdName.length() - 3); + } + + // remove if too long and contains fylke + 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; + + // Finn indeksen til den lengste delen, sortert fra høyre + for (int i = 0; i < parts.length; i++) { + if (parts[i].length() >= longestPartLength) { + longestPartLength = parts[i].length(); + longestPartIndex = i; + } + } + + // Fjern siste tegn fra den lengste delen + if (longestPartIndex != -1 && parts[longestPartIndex].length() > 0) { + parts[longestPartIndex] = parts[longestPartIndex].substring(0, parts[longestPartIndex].length() - 1); + } + + // Sett sammen strengen igjen + 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/FintAdapterDependentResource.java b/src/main/java/no/fintlabs/adapter/FintAdapterDependentResource.java index 682a49f..0ac575b 100644 --- a/src/main/java/no/fintlabs/adapter/FintAdapterDependentResource.java +++ b/src/main/java/no/fintlabs/adapter/FintAdapterDependentResource.java @@ -6,6 +6,7 @@ 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 org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.SerializationUtils; @@ -58,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) diff --git a/src/main/java/no/fintlabs/client/FintClientDependentResource.java b/src/main/java/no/fintlabs/client/FintClientDependentResource.java index 3dc623f..88a5c04 100644 --- a/src/main/java/no/fintlabs/client/FintClientDependentResource.java +++ b/src/main/java/no/fintlabs/client/FintClientDependentResource.java @@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j; import no.fintlabs.CustomerObjectResponseException; import no.fintlabs.FlaisExternalDependentResource; +import no.fintlabs.LdapNameGeneratorUtil; import no.fintlabs.SecretService; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.SerializationUtils; @@ -61,7 +62,8 @@ protected Client desired(FintClientCrd primary, Context context) private Supplier handleDesiredOnNew(FintClientCrd primary) { return () -> { - String clientName = String.format("%s-%s", primary.getMetadata().getName(), RandomStringUtils.randomAlphabetic(5).toLowerCase()); + String clientName = LdapNameGeneratorUtil.generate(primary.getMetadata().getName(), primary.getSpec().getOrgId(), "client"); + Client client = Client .builder() .name(clientName) diff --git a/src/main/java/no/fintlabs/client/FintClientRepository.java b/src/main/java/no/fintlabs/client/FintClientRepository.java index b6a1276..9e4b3ab 100644 --- a/src/main/java/no/fintlabs/client/FintClientRepository.java +++ b/src/main/java/no/fintlabs/client/FintClientRepository.java @@ -74,7 +74,7 @@ public Set get(FintClientCrd crd) { Optional dn = getValueFromAnnotationByKey(crd, FintClientDependentResource.ANNOTATION_CLIENT_DN); if (dn.isEmpty()) { - log.debug("Skipping client lookup due to missing DN in CRD."); + log.warn("Skipping client lookup due to missing DN in CRD."); return Collections.emptySet(); } diff --git a/src/test/java/no/fintlabs/LdapNameGeneratorUtilTest.java b/src/test/java/no/fintlabs/LdapNameGeneratorUtilTest.java new file mode 100644 index 0000000..d02dc77 --- /dev/null +++ b/src/test/java/no/fintlabs/LdapNameGeneratorUtilTest.java @@ -0,0 +1,131 @@ +package no.fintlabs; + +import groovy.util.logging.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.util.Assert; + +import static org.junit.jupiter.api.Assertions.*; + +class LdapNameGeneratorUtilTest { + + @Test + void generateNormal() { + // Sett opp testdata + String crdName = "drosjeloyve"; + String orgId = "agderfk.no"; + String type = "client"; + + // Utfør metoden som skal testes + String result = LdapNameGeneratorUtil.generate(crdName, orgId, type); + + // Sjekk at resultatet er som forventet + assertEquals( "drosjeloyve", result.substring(0, result.length() - 6)); + System.out.println(result); + } + + @Test + void generateRemovalOfNo() { + // Sett opp testdata + String crdName = "drosjeloyve-beta-trondelagfylke-no"; + String orgId = "trondelagfylke.no"; + String type = "client"; + + // Utfør metoden som skal testes + String result = LdapNameGeneratorUtil.generate(crdName, orgId, type); + + // Sjekk at resultatet er som forventet + assertEquals( "drosjeloyve-beta-trondelagfylke", result.substring(0, result.length() - 6)); + System.out.println(result); + } + + @Test + void generateRemovalOfFylke() { + // Sett opp testdata + String crdName = "drosjeloyve-beta-test-trondelagfylke-no"; + String orgId = "trondelagfylke.no"; + String type = "client"; + + // Utfør metoden som skal testes + String result = LdapNameGeneratorUtil.generate(crdName, orgId, type); + + // Sjekk at resultatet er som forventet + assertEquals( "drosjeloyve-beta-test-trondelag", result.substring(0, result.length() - 6)); + System.out.println(result); + } + + @Test + void generateRemovalOfLongestPart() { + // Sett opp testdata + String crdName = "drosjeloyve-beta-trondelag-test1-t"; + String orgId = "trondelagfylke.no"; + String type = "client"; + + // Utfør metoden som skal testes + String result = LdapNameGeneratorUtil.generate(crdName, orgId, type); + + // Sjekk at resultatet er som forventet + assertEquals( "drosjeloyv-beta-trondelag-test1-t", result.substring(0, result.length() - 6)); + System.out.println(result); + } + + @Test + void generateRemovalOfLongestPart2() { + // Sett opp testdata + String crdName = "drosjeloyve-beta-trondelag-test1-tes"; + String orgId = "trondelagfylke.no"; + String type = "client"; + + // Utfør metoden som skal testes + String result = LdapNameGeneratorUtil.generate(crdName, orgId, type); + + // Sjekk at resultatet er som forventet + assertEquals( "drosjeloy-beta-trondela-test1-tes", result.substring(0, result.length() - 6)); + System.out.println(result); + } + + @Test + void generateRemovalOfLongestPart3() { + // Sett opp testdata + String crdName = "drosjeloyve-beta-trondelag-test1-tes-test"; + String orgId = "trondelagfylke.no"; + String type = "client"; + + // Utfør metoden som skal testes + String result = LdapNameGeneratorUtil.generate(crdName, orgId, type); + + // Sjekk at resultatet er som forventet + assertEquals( "drosje-beta-tronde-test1-tes-test", result.substring(0, result.length() - 6)); + System.out.println(result); + } + +// @Test +// void generateLong() { +// // Sett opp testdata +// String crdName = "drosjeloyve-beta-trondelagfylke-no"; +// String randomString = "wayzk"; +// String orgId = "trondelagfylke.no"; +// String type = "client"; +// +// // Utfør metoden som skal testes +// String result = LdapNameGeneratorUtil.generate(crdName, randomString, orgId, type); +// +// // Sjekk at resultatet er som forventet +// assertEquals("drosjeloyve-beta-trondelagfylke-no-wayzk@client.trondelagfylke.no", result); +// } + + @Test + void generateFullName() { + // Sett opp testdata + String crdName = "drosjeloyve-beta-trondelagfylke-no"; + String randomString = "wayzk"; + String orgId = "trondelagfylke.no"; + String type = "client"; + + // Utfør metoden som skal testes + String result = LdapNameGeneratorUtil.generateFullName(crdName, randomString, orgId, type); + + // Sjekk at resultatet er som forventet + assertEquals("drosjeloyve-beta-trondelagfylke-no-wayzk@client.trondelagfylke.no", result); + + } +} \ No newline at end of file From b4fd166c018c4ea76381ecadb1a39bd35b0c1f88 Mon Sep 17 00:00:00 2001 From: Trond Magnus Sevre Date: Mon, 4 Dec 2023 13:20:06 +0100 Subject: [PATCH 08/18] Dont return empty in fetch if dn is set but respons is empty --- src/main/java/no/fintlabs/adapter/FintAdapterRepository.java | 4 ++-- src/main/java/no/fintlabs/client/FintClientRepository.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/no/fintlabs/adapter/FintAdapterRepository.java b/src/main/java/no/fintlabs/adapter/FintAdapterRepository.java index 5e2ea46..6afe073 100644 --- a/src/main/java/no/fintlabs/adapter/FintAdapterRepository.java +++ b/src/main/java/no/fintlabs/adapter/FintAdapterRepository.java @@ -93,8 +93,8 @@ public Set get(FintAdapterCrd crd) { } if (response.getObject() == null) { - log.debug("Object in response is null"); - return Collections.emptySet(); + log.error("DN has been set, but the client could not be found! {}", dn.get()); + throw new IllegalStateException("DN has been set, but the client could not be found! " + dn.get()); } return Collections.singleton(response.getObject()); diff --git a/src/main/java/no/fintlabs/client/FintClientRepository.java b/src/main/java/no/fintlabs/client/FintClientRepository.java index 9e4b3ab..6ce289c 100644 --- a/src/main/java/no/fintlabs/client/FintClientRepository.java +++ b/src/main/java/no/fintlabs/client/FintClientRepository.java @@ -92,8 +92,8 @@ public Set get(FintClientCrd crd) { } if (response.getObject() == null) { - log.debug("Object in response is null"); - return Collections.emptySet(); + log.error("DN has been set, but the client could not be found! {}", dn.get()); + throw new IllegalStateException("DN has been set, but the client could not be found! " + dn.get()); } return Collections.singleton(response.getObject()); From 52b26f2848b19ddb2c0a86309a9fd02b28ef835b Mon Sep 17 00:00:00 2001 From: Trond Magnus Sevre Date: Mon, 4 Dec 2023 13:43:10 +0100 Subject: [PATCH 09/18] Add empty space filter in getValueFromAnnotationByKey --- src/main/java/no/fintlabs/CrdUtilities.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/no/fintlabs/CrdUtilities.java b/src/main/java/no/fintlabs/CrdUtilities.java index 075d322..fe39e66 100644 --- a/src/main/java/no/fintlabs/CrdUtilities.java +++ b/src/main/java/no/fintlabs/CrdUtilities.java @@ -1,12 +1,14 @@ package no.fintlabs; import io.fabric8.kubernetes.api.model.HasMetadata; +import org.springframework.util.StringUtils; import java.util.Optional; public class CrdUtilities { public static Optional getValueFromAnnotationByKey(HasMetadata crd, String key) { - return Optional.ofNullable(crd.getMetadata().getAnnotations().get(key)); + return Optional.ofNullable(crd.getMetadata().getAnnotations().get(key)) + .filter(StringUtils::hasText); } } \ No newline at end of file From 03796ae4fdaaf99888be0282bfa2de0c468e81cf Mon Sep 17 00:00:00 2001 From: Trond Magnus Sevre Date: Mon, 4 Dec 2023 14:33:34 +0100 Subject: [PATCH 10/18] Improve logging --- src/main/java/no/fintlabs/adapter/FintAdapterRepository.java | 2 ++ src/main/java/no/fintlabs/client/FintClientRepository.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/main/java/no/fintlabs/adapter/FintAdapterRepository.java b/src/main/java/no/fintlabs/adapter/FintAdapterRepository.java index 6afe073..091b581 100644 --- a/src/main/java/no/fintlabs/adapter/FintAdapterRepository.java +++ b/src/main/java/no/fintlabs/adapter/FintAdapterRepository.java @@ -83,12 +83,14 @@ public Set get(FintAdapterCrd crd) { Optional responseOptional = adapterEventRequestProducerService.get(createRequestEvent(crd, dn.get())); if (responseOptional.isEmpty()) { + log.error("Empty response from Kafka. The request has probably timed out. Client: {}", dn.get()); throw new CustomerObjectResponseException("Empty response from Kafka. The request has probably timed out. Client: " + dn.get()); } AdapterEvent response = responseOptional.get(); if (response.hasError()){ + log.error("Error response from Kafka: {}", response.getErrorMessage()); throw new CustomerObjectResponseException(response.getErrorMessage()); } diff --git a/src/main/java/no/fintlabs/client/FintClientRepository.java b/src/main/java/no/fintlabs/client/FintClientRepository.java index 6ce289c..08957f5 100644 --- a/src/main/java/no/fintlabs/client/FintClientRepository.java +++ b/src/main/java/no/fintlabs/client/FintClientRepository.java @@ -82,12 +82,14 @@ public Set get(FintClientCrd crd) { Optional responseOptional = clientEventRequestProducerService.get(createRequestEvent(crd, dn.get())); if (responseOptional.isEmpty()) { + log.error("Empty response from Kafka. The request has probably timed out. Client: {}", dn.get()); throw new CustomerObjectResponseException("Empty response from Kafka. The request has probably timed out. Client: " + dn.get()); } ClientEvent response = responseOptional.get(); if (response.hasError()) { + log.error("Error response from Kafka: {}", response.getErrorMessage()); throw new CustomerObjectResponseException(response.getErrorMessage()); } From 5fa01177110cfa1389743b7dcff87cff8ef06de2 Mon Sep 17 00:00:00 2001 From: Sondre Nordjore Date: Mon, 26 Feb 2024 10:16:58 +0100 Subject: [PATCH 11/18] Deploy to alpha --- .github/workflows/build-and-deploy.yaml | 114 ++++++++++++------------ 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/.github/workflows/build-and-deploy.yaml b/.github/workflows/build-and-deploy.yaml index 3330693..e21b879 100644 --- a/.github/workflows/build-and-deploy.yaml +++ b/.github/workflows/build-and-deploy.yaml @@ -81,60 +81,60 @@ jobs: namespace: operators action: deploy - ## API cluster ## - - name: Bake api manifests with Kustomize - uses: azure/k8s-bake@v2 - with: - renderEngine: 'kustomize' - kustomizationPath: 'kustomize/overlays/api' - id: bake-api - - - uses: azure/login@v1 - with: - creds: '${{ secrets.AKS_API_FINT_GITHUB }}' - - - name: Set the target Api cluster. - uses: azure/aks-set-context@v3 - with: - cluster-name: ${{ env.API_CLUSTER_NAME }} - resource-group: ${{ env.API_CLUSTER_RESOURCE_GROUP }} - admin: 'true' - use-kubelogin: 'true' - - - name: Deploy to Api - uses: azure/k8s-deploy@v4.9 - with: - manifests: ${{ steps.bake-api.outputs.manifestsBundle }} - images: | - ${{ steps.meta.outputs.tags }} - namespace: operators - action: deploy - - ## Beta cluster ## - - name: Bake beta manifests with Kustomize - uses: azure/k8s-bake@v2 - with: - renderEngine: 'kustomize' - kustomizationPath: 'kustomize/overlays/beta' - id: bake-beta - - - uses: azure/login@v1 - with: - creds: '${{ secrets.AKS_BETA_FINT_GITHUB }}' - - - name: Set the target Beta cluster. - uses: azure/aks-set-context@v3 - with: - cluster-name: ${{ env.BETA_CLUSTER_NAME }} - resource-group: ${{ env.BETA_CLUSTER_RESOURCE_GROUP }} - admin: 'true' - use-kubelogin: 'true' - - - name: Deploy to Beta - uses: azure/k8s-deploy@v4.9 - with: - manifests: ${{ steps.bake-beta.outputs.manifestsBundle }} - images: | - ${{ steps.meta.outputs.tags }} - namespace: operators - action: deploy \ No newline at end of file +# ## API cluster ## +# - name: Bake api manifests with Kustomize +# uses: azure/k8s-bake@v2 +# with: +# renderEngine: 'kustomize' +# kustomizationPath: 'kustomize/overlays/api' +# id: bake-api +# +# - uses: azure/login@v1 +# with: +# creds: '${{ secrets.AKS_API_FINT_GITHUB }}' +# +# - name: Set the target Api cluster. +# uses: azure/aks-set-context@v3 +# with: +# cluster-name: ${{ env.API_CLUSTER_NAME }} +# resource-group: ${{ env.API_CLUSTER_RESOURCE_GROUP }} +# admin: 'true' +# use-kubelogin: 'true' +# +# - name: Deploy to Api +# uses: azure/k8s-deploy@v4.9 +# with: +# manifests: ${{ steps.bake-api.outputs.manifestsBundle }} +# images: | +# ${{ steps.meta.outputs.tags }} +# namespace: operators +# action: deploy +# +# ## Beta cluster ## +# - name: Bake beta manifests with Kustomize +# uses: azure/k8s-bake@v2 +# with: +# renderEngine: 'kustomize' +# kustomizationPath: 'kustomize/overlays/beta' +# id: bake-beta +# +# - uses: azure/login@v1 +# with: +# creds: '${{ secrets.AKS_BETA_FINT_GITHUB }}' +# +# - name: Set the target Beta cluster. +# uses: azure/aks-set-context@v3 +# with: +# cluster-name: ${{ env.BETA_CLUSTER_NAME }} +# resource-group: ${{ env.BETA_CLUSTER_RESOURCE_GROUP }} +# admin: 'true' +# use-kubelogin: 'true' +# +# - name: Deploy to Beta +# uses: azure/k8s-deploy@v4.9 +# with: +# manifests: ${{ steps.bake-beta.outputs.manifestsBundle }} +# images: | +# ${{ steps.meta.outputs.tags }} +# namespace: operators +# action: deploy \ No newline at end of file From 60b751bdd75ce1f10e7991c61c4f1cd60589f8de Mon Sep 17 00:00:00 2001 From: Sondre Nordjore Date: Mon, 26 Feb 2024 10:26:38 +0100 Subject: [PATCH 12/18] Added "filter" to Alpha --- kustomize/overlays/alpha/kustomization.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/kustomize/overlays/alpha/kustomization.yaml b/kustomize/overlays/alpha/kustomization.yaml index bed81a1..95c5341 100644 --- a/kustomize/overlays/alpha/kustomization.yaml +++ b/kustomize/overlays/alpha/kustomization.yaml @@ -2,6 +2,8 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - ../../base +patchesStrategicMerge: + - exclude-kafka.yaml patches: - patch: |- - op: replace @@ -9,4 +11,13 @@ patches: value: "vaults/aks-alpha-vault/items/finterator" target: kind: OnePasswordItem + 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 \ No newline at end of file From a8032ea3b2fe98b5f2feddb17bc4c76bb4c89dee Mon Sep 17 00:00:00 2001 From: Sondre Nordjore Date: Mon, 26 Feb 2024 10:29:57 +0100 Subject: [PATCH 13/18] Fixed dementia --- kustomize/overlays/alpha/exclude-kafka.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 kustomize/overlays/alpha/exclude-kafka.yaml diff --git a/kustomize/overlays/alpha/exclude-kafka.yaml b/kustomize/overlays/alpha/exclude-kafka.yaml new file mode 100644 index 0000000..fa5ca86 --- /dev/null +++ b/kustomize/overlays/alpha/exclude-kafka.yaml @@ -0,0 +1,9 @@ +$patch: delete +apiVersion: "fintlabs.no/v1alpha1" +kind: KafkaUserAndAcl +metadata: + name: finterator +spec: + acls: + - permission: admin + topic: 'flais-io.fint-customer-objects.*' \ No newline at end of file From 7e6e64fbe8012859f8c4912fb146010c118e00fc Mon Sep 17 00:00:00 2001 From: Sondre Nordjore Date: Thu, 14 Mar 2024 13:21:20 +0100 Subject: [PATCH 14/18] Test change to assetid in Alpha --- .github/workflows/build-and-deploy.yaml | 116 ++++++++++++------------ 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/.github/workflows/build-and-deploy.yaml b/.github/workflows/build-and-deploy.yaml index 3ad2a92..ab14c47 100644 --- a/.github/workflows/build-and-deploy.yaml +++ b/.github/workflows/build-and-deploy.yaml @@ -2,7 +2,7 @@ name: Create and publish a Docker image on: push: - branches: ['main'] + branches: ['FLA-191-support-assets'] env: REGISTRY: ghcr.io @@ -81,60 +81,60 @@ jobs: namespace: operators action: deploy - ## API cluster ## - - name: Bake api manifests with Kustomize - uses: azure/k8s-bake@v2 - with: - renderEngine: 'kustomize' - kustomizationPath: 'kustomize/overlays/api' - id: bake-api - - - uses: azure/login@v1 - with: - creds: '${{ secrets.AKS_API_FINT_GITHUB }}' - - - name: Set the target Api cluster. - uses: azure/aks-set-context@v3 - with: - cluster-name: ${{ env.API_CLUSTER_NAME }} - resource-group: ${{ env.API_CLUSTER_RESOURCE_GROUP }} - admin: 'true' - use-kubelogin: 'true' - - - name: Deploy to Api - uses: azure/k8s-deploy@v4.9 - with: - manifests: ${{ steps.bake-api.outputs.manifestsBundle }} - images: | - ${{ steps.meta.outputs.tags }} - namespace: operators - action: deploy - - ## Beta cluster ## - - name: Bake beta manifests with Kustomize - uses: azure/k8s-bake@v2 - with: - renderEngine: 'kustomize' - kustomizationPath: 'kustomize/overlays/beta' - id: bake-beta - - - uses: azure/login@v1 - with: - creds: '${{ secrets.AKS_BETA_FINT_GITHUB }}' - - - name: Set the target Beta cluster. - uses: azure/aks-set-context@v3 - with: - cluster-name: ${{ env.BETA_CLUSTER_NAME }} - resource-group: ${{ env.BETA_CLUSTER_RESOURCE_GROUP }} - admin: 'true' - use-kubelogin: 'true' - - - name: Deploy to Beta - uses: azure/k8s-deploy@v4.9 - with: - manifests: ${{ steps.bake-beta.outputs.manifestsBundle }} - images: | - ${{ steps.meta.outputs.tags }} - namespace: operators - action: deploy \ No newline at end of file +# ## API cluster ## +# - name: Bake api manifests with Kustomize +# uses: azure/k8s-bake@v2 +# with: +# renderEngine: 'kustomize' +# kustomizationPath: 'kustomize/overlays/api' +# id: bake-api +# +# - uses: azure/login@v1 +# with: +# creds: '${{ secrets.AKS_API_FINT_GITHUB }}' +# +# - name: Set the target Api cluster. +# uses: azure/aks-set-context@v3 +# with: +# cluster-name: ${{ env.API_CLUSTER_NAME }} +# resource-group: ${{ env.API_CLUSTER_RESOURCE_GROUP }} +# admin: 'true' +# use-kubelogin: 'true' +# +# - name: Deploy to Api +# uses: azure/k8s-deploy@v4.9 +# with: +# manifests: ${{ steps.bake-api.outputs.manifestsBundle }} +# images: | +# ${{ steps.meta.outputs.tags }} +# namespace: operators +# action: deploy +# +# ## Beta cluster ## +# - name: Bake beta manifests with Kustomize +# uses: azure/k8s-bake@v2 +# with: +# renderEngine: 'kustomize' +# kustomizationPath: 'kustomize/overlays/beta' +# id: bake-beta +# +# - uses: azure/login@v1 +# with: +# creds: '${{ secrets.AKS_BETA_FINT_GITHUB }}' +# +# - name: Set the target Beta cluster. +# uses: azure/aks-set-context@v3 +# with: +# cluster-name: ${{ env.BETA_CLUSTER_NAME }} +# resource-group: ${{ env.BETA_CLUSTER_RESOURCE_GROUP }} +# admin: 'true' +# use-kubelogin: 'true' +# +# - name: Deploy to Beta +# uses: azure/k8s-deploy@v4.9 +# with: +# manifests: ${{ steps.bake-beta.outputs.manifestsBundle }} +# images: | +# ${{ steps.meta.outputs.tags }} +# namespace: operators +# action: deploy From eb02e88c37d732fa9724cef3d0f10dfb452a17e8 Mon Sep 17 00:00:00 2001 From: Sondre Nordjore Date: Mon, 18 Mar 2024 10:13:08 +0100 Subject: [PATCH 15/18] AssetId seems to have support now --- examples/fint-adapter2.yaml | 9 +++++---- kustomize/base/fintadapters.fintlabs.no-v1.yml | 2 +- src/main/java/no/fintlabs/adapter/Adapter.java | 10 ++++++++++ .../adapter/FintAdapterDependentResource.java | 16 +++++++++++----- .../no/fintlabs/adapter/FintAdapterSpec.java | 3 ++- 5 files changed, 29 insertions(+), 11 deletions(-) diff --git a/examples/fint-adapter2.yaml b/examples/fint-adapter2.yaml index 410abad..d68b601 100644 --- a/examples/fint-adapter2.yaml +++ b/examples/fint-adapter2.yaml @@ -1,7 +1,7 @@ apiVersion: fintlabs.no/v1alpha1 kind: FintAdapter metadata: - name: test-adapter + name: test-asset-id-adapter namespace: fintlabs-no labels: app.kubernetes.io/name: test-adapter @@ -18,9 +18,10 @@ spec: components: - administrasjon_personal - utdanning_elev - assets: - - fylkesting.fintlabs.no + assetIds: + - 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/kustomize/base/fintadapters.fintlabs.no-v1.yml b/kustomize/base/fintadapters.fintlabs.no-v1.yml index e8075c0..0fe1cdf 100644 --- a/kustomize/base/fintadapters.fintlabs.no-v1.yml +++ b/kustomize/base/fintadapters.fintlabs.no-v1.yml @@ -25,7 +25,7 @@ spec: items: type: string type: array - assets: + assetIds: items: type: string type: array diff --git a/src/main/java/no/fintlabs/adapter/Adapter.java b/src/main/java/no/fintlabs/adapter/Adapter.java index 80bfc5c..4b7c93b 100644 --- a/src/main/java/no/fintlabs/adapter/Adapter.java +++ b/src/main/java/no/fintlabs/adapter/Adapter.java @@ -70,6 +70,16 @@ 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 051446b..194bcad 100644 --- a/src/main/java/no/fintlabs/adapter/FintAdapterDependentResource.java +++ b/src/main/java/no/fintlabs/adapter/FintAdapterDependentResource.java @@ -70,9 +70,12 @@ private Supplier handleDesiredOnNew(FintAdapterCrd primary) { primary.getSpec().getComponents() .forEach(component -> adapter.addComponent(String.format("ou=%s,ou=components,o=fint", component))); + primary.getSpec().getAssetIds() + .forEach(adapter::addAssetId); + String orgId = primary.getSpec().getOrgId().replace(".","_"); - primary.getSpec().getAssets() - .forEach(asset -> adapter.addAssets(String.format("ou=%s,ou=assets,ou=%s,ou=organisations,o=fint", asset.replace(".","_"), orgId))); +// primary.getSpec().getAssets() +// .forEach(asset -> adapter.addAssets(String.format("ou=%s,ou=assets,ou=%s,ou=organisations,o=fint", asset.replace(".","_"), orgId))); log.info("No adapter found in event store. Desired adapter is: {}", adapter); return adapter; @@ -90,14 +93,17 @@ private Function handleDesiredForExisting(FintAdapterCrd prima Adapter desiredAdapter = SerializationUtils.clone(currentAdapter); desiredAdapter.setNote(generateNote(primary)); desiredAdapter.getComponents().clear(); - desiredAdapter.getAssets().clear(); +// desiredAdapter.getAssets().clear(); + desiredAdapter.getAssetIds().clear(); desiredAdapter.setManaged(true); primary.getSpec().getComponents() .forEach(component -> desiredAdapter.addComponent(String.format("ou=%s,ou=components,o=fint", component))); + primary.getSpec().getAssetIds() + .forEach(desiredAdapter::addAssetId); 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))); +// primary.getSpec().getAssets() +// .forEach(asset -> desiredAdapter.addAssets(String.format("ou=%s,ou=assets,ou=%s,ou=organisations,o=fint", asset.replace(".","_"), orgId))); return desiredAdapter; }; diff --git a/src/main/java/no/fintlabs/adapter/FintAdapterSpec.java b/src/main/java/no/fintlabs/adapter/FintAdapterSpec.java index 9bd1c9f..1c5bbdd 100644 --- a/src/main/java/no/fintlabs/adapter/FintAdapterSpec.java +++ b/src/main/java/no/fintlabs/adapter/FintAdapterSpec.java @@ -16,6 +16,7 @@ public class FintAdapterSpec implements FlaisSpec { private String orgId; private String note; private List components = Collections.emptyList(); - private List assets = Collections.emptyList(); + private List assetIds = Collections.emptyList(); +// private List assets = Collections.emptyList(); } From 87d3b93eb12f9bf32c34518167be567141c19d03 Mon Sep 17 00:00:00 2001 From: Sondre Nordjore Date: Mon, 18 Mar 2024 10:24:28 +0100 Subject: [PATCH 16/18] Cleanup code --- .../fintlabs/adapter/FintAdapterDependentResource.java | 10 ---------- src/main/java/no/fintlabs/adapter/FintAdapterSpec.java | 1 - 2 files changed, 11 deletions(-) diff --git a/src/main/java/no/fintlabs/adapter/FintAdapterDependentResource.java b/src/main/java/no/fintlabs/adapter/FintAdapterDependentResource.java index 194bcad..e434dd2 100644 --- a/src/main/java/no/fintlabs/adapter/FintAdapterDependentResource.java +++ b/src/main/java/no/fintlabs/adapter/FintAdapterDependentResource.java @@ -69,13 +69,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().getAssetIds() .forEach(adapter::addAssetId); - - String orgId = primary.getSpec().getOrgId().replace(".","_"); -// primary.getSpec().getAssets() -// .forEach(asset -> adapter.addAssets(String.format("ou=%s,ou=assets,ou=%s,ou=organisations,o=fint", asset.replace(".","_"), orgId))); log.info("No adapter found in event store. Desired adapter is: {}", adapter); return adapter; @@ -93,7 +88,6 @@ private Function handleDesiredForExisting(FintAdapterCrd prima Adapter desiredAdapter = SerializationUtils.clone(currentAdapter); desiredAdapter.setNote(generateNote(primary)); desiredAdapter.getComponents().clear(); -// desiredAdapter.getAssets().clear(); desiredAdapter.getAssetIds().clear(); desiredAdapter.setManaged(true); primary.getSpec().getComponents() @@ -101,10 +95,6 @@ private Function handleDesiredForExisting(FintAdapterCrd prima primary.getSpec().getAssetIds() .forEach(desiredAdapter::addAssetId); - 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; }; } diff --git a/src/main/java/no/fintlabs/adapter/FintAdapterSpec.java b/src/main/java/no/fintlabs/adapter/FintAdapterSpec.java index 1c5bbdd..b0bfeaf 100644 --- a/src/main/java/no/fintlabs/adapter/FintAdapterSpec.java +++ b/src/main/java/no/fintlabs/adapter/FintAdapterSpec.java @@ -17,6 +17,5 @@ public class FintAdapterSpec implements FlaisSpec { private String note; private List components = Collections.emptyList(); private List assetIds = Collections.emptyList(); -// private List assets = Collections.emptyList(); } From eac99647dcdce393b0719032edc4d5145736776b Mon Sep 17 00:00:00 2001 From: Sondre Nordjore Date: Mon, 18 Mar 2024 10:53:31 +0100 Subject: [PATCH 17/18] Updated readme --- .github/workflows/build-and-deploy.yaml | 2 +- README.md | 34 ++++++++++++++++++++++--- examples/fint-adapter2.yaml | 2 +- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-and-deploy.yaml b/.github/workflows/build-and-deploy.yaml index ab14c47..2e9d9be 100644 --- a/.github/workflows/build-and-deploy.yaml +++ b/.github/workflows/build-and-deploy.yaml @@ -2,7 +2,7 @@ name: Create and publish a Docker image on: push: - branches: ['FLA-191-support-assets'] + branches: ['main'] env: REGISTRY: ghcr.io diff --git a/README.md b/README.md index e858cc4..7add453 100644 --- a/README.md +++ b/README.md @@ -10,19 +10,44 @@ openssl genpkey -algorithm rsa ``` - +### Client .yaml example file: ```yaml apiVersion: fintlabs.no/v1alpha1 kind: FintClient metadata: - name: frodes-test-client + name: flais-test-client + namespace: fintlabs-no + labels: + app.kubernetes.io/name: test-client + app.kubernetes.io/instance: test-service-backend-client_rogfk_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: FintAdapter +metadata: + 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/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 @@ -33,4 +58,7 @@ spec: components: - administrasjon_personal - utdanning_elev + assetIds: + - test.fylke.no + - test.annet_fylke.no ``` diff --git a/examples/fint-adapter2.yaml b/examples/fint-adapter2.yaml index d68b601..845ad37 100644 --- a/examples/fint-adapter2.yaml +++ b/examples/fint-adapter2.yaml @@ -1,7 +1,7 @@ apiVersion: fintlabs.no/v1alpha1 kind: FintAdapter metadata: - name: test-asset-id-adapter + name: testadapter namespace: fintlabs-no labels: app.kubernetes.io/name: test-adapter From 99fbcd9422da55d48f1fcf8e7d32b4b448826f49 Mon Sep 17 00:00:00 2001 From: Sondre Nordjore Date: Thu, 31 Oct 2024 12:12:49 +0100 Subject: [PATCH 18/18] Added tests --- build.gradle | 2 + .../java/no/fintlabs/adapter/AdapterTest.java | 72 ++++++++++++++ .../FintAdapterDependentResourceTest.java | 94 +++++++++++++++++++ 3 files changed, 168 insertions(+) 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/build.gradle b/build.gradle index ad52e5c..8bacb29 100644 --- a/build.gradle +++ b/build.gradle @@ -29,6 +29,8 @@ dependencies { implementation 'no.fintlabs:flais-operator-starter:1.0.0' testImplementation 'org.junit.jupiter:junit-jupiter:5.8.1' + testImplementation 'org.testng:testng:7.1.0' + testImplementation 'junit:junit:4.13.1' annotationProcessor 'io.fabric8:crd-generator-apt:6.2.0' implementation 'org.springframework.kafka:spring-kafka' 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..33f065a --- /dev/null +++ b/src/test/java/no/fintlabs/adapter/AdapterTest.java @@ -0,0 +1,72 @@ +package no.fintlabs.adapter; + +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class AdapterTest { + // Test that assetId is added if it is not in the list + @Test + public void testAddAssetIdNotInList() { + Adapter adapter = testAdapter(); + adapter.addAssetId("asset1"); + assertTrue(adapter.getAssetIds().contains("asset1")); + } + + // Test that assetId is not added if it is already in the list + @Test + public void testAddAssetIdAlreadyInList() { + Adapter adapter = testAdapter(); + adapter.addAssetId("asset1"); + adapter.addAssetId("asset1"); + assertEquals(1,adapter.getAssetIds().size()); + } + + // Test that component is added if it is not in the list + @Test + public void testAddComponentWhenListIsEmpty() { + Adapter adapter = testAdapter(); + adapter.addComponent("component1"); + assertTrue(adapter.getComponents().contains("component1")); + assertEquals(1,adapter.getComponents().size()); + } + + // Test that component is added if it does not exist + @Test + public void testAddComponentWhenComponentDoesNotExist() { + Adapter adapter = testAdapter(); + adapter.addComponent("component1"); + assertEquals(1,adapter.getComponents().size()); + assertEquals("component1",adapter.getComponents().get(0)); + } + + // Test that component is not added if it already exists + @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..7dc671a --- /dev/null +++ b/src/test/java/no/fintlabs/adapter/FintAdapterDependentResourceTest.java @@ -0,0 +1,94 @@ +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.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; + +import static org.junit.jupiter.api.Assertions.assertEquals; +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 occurred 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); + 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<>()); + } +}