From fe52f1b0054d4551f83d9448d894160981c4e07f Mon Sep 17 00:00:00 2001 From: Edyta Krukowska Date: Tue, 5 Jan 2021 12:27:02 +0100 Subject: Create IT test for downloading artifacts Issue-ID: SDC-3417 Signed-off-by: Edyta Krukowska Change-Id: I8bd24c34902a2d59d0d0dd1b0c1e8c08352a4cc2 --- sdc-distribution-ci/pom.xml | 14 ++ .../test/core/config/DistributionClientConfig.java | 2 +- .../test/core/service/ClientNotifyCallback.java | 11 +- .../test/core/service/ClientInitializerTest.java | 46 +++++- .../src/test/resources/artifacts.json | 170 +++++++++++++++++++++ .../org/onap/sdc/impl/DistributionClientImpl.java | 1 - 6 files changed, 237 insertions(+), 7 deletions(-) create mode 100644 sdc-distribution-ci/src/test/resources/artifacts.json diff --git a/sdc-distribution-ci/pom.xml b/sdc-distribution-ci/pom.xml index b1dfa86..9af54ca 100644 --- a/sdc-distribution-ci/pom.xml +++ b/sdc-distribution-ci/pom.xml @@ -23,6 +23,8 @@ 5.4.2 5.4.2 5.4.2 + 3.0.0 + 3.0.0 @@ -99,6 +101,18 @@ ${mockito-junit-jupiter.version} test + + org.awaitility + awaitility + ${awaitility.version} + test + + + org.awaitility + awaitility-proxy + ${awaitility-proxy.version} + test + diff --git a/sdc-distribution-ci/src/main/java/org/onap/test/core/config/DistributionClientConfig.java b/sdc-distribution-ci/src/main/java/org/onap/test/core/config/DistributionClientConfig.java index be6f6a6..8a02801 100644 --- a/sdc-distribution-ci/src/main/java/org/onap/test/core/config/DistributionClientConfig.java +++ b/sdc-distribution-ci/src/main/java/org/onap/test/core/config/DistributionClientConfig.java @@ -38,7 +38,7 @@ public class DistributionClientConfig implements IConfiguration { public static final String DEFAULT_KEY_STORE_PATH = "etc/asdc-client.jks"; public static final String DEFAULT_KEY_STORE_PASSWORD = "Aa123456"; public static final boolean DEFAULT_ACTIVATE_SERVER_TLS_AUTH = false; - public static final boolean DEFAULT_IS_FILTER_IN_EMPTY_RESOURCES = false; + public static final boolean DEFAULT_IS_FILTER_IN_EMPTY_RESOURCES = true; public static final boolean DEFAULT_USE_HTTPS_WITH_SDC = false; public static final String DEFAULT_MSG_BUS_ADDRESS = "localhost"; private String asdcAddress; diff --git a/sdc-distribution-ci/src/main/java/org/onap/test/core/service/ClientNotifyCallback.java b/sdc-distribution-ci/src/main/java/org/onap/test/core/service/ClientNotifyCallback.java index 7737457..4dfe388 100644 --- a/sdc-distribution-ci/src/main/java/org/onap/test/core/service/ClientNotifyCallback.java +++ b/sdc-distribution-ci/src/main/java/org/onap/test/core/service/ClientNotifyCallback.java @@ -25,6 +25,7 @@ import org.onap.sdc.api.notification.INotificationData; import org.onap.sdc.api.notification.IResourceInstance; import org.onap.sdc.http.HttpAsdcClient; import org.onap.sdc.http.SdcConnectorClient; +import org.onap.sdc.impl.DistributionClientDownloadResultImpl; import org.onap.sdc.impl.DistributionClientImpl; import org.onap.sdc.utils.DistributionStatusEnum; import org.onap.test.core.config.DistributionClientConfig; @@ -33,6 +34,7 @@ import org.slf4j.LoggerFactory; import java.time.LocalDateTime; import java.time.ZoneOffset; +import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -42,11 +44,16 @@ public class ClientNotifyCallback implements INotificationCallback { private final List validators; private final DistributionClientImpl distributionClient; + private final List pulledArtifacts = new ArrayList<>(); DistributionClientConfig config = new DistributionClientConfig(); HttpAsdcClient asdcClient = new HttpAsdcClient(config); - SdcConnectorClient sdcConnectorClient = new SdcConnectorClient(config,asdcClient); + SdcConnectorClient sdcConnectorClient = new SdcConnectorClient(config, asdcClient); ArtifactsDownloader artifactsDownloader = new ArtifactsDownloader("/app/path", sdcConnectorClient); + public List getPulledArtifacts() { + return List.copyOf(pulledArtifacts); + } + public ClientNotifyCallback(List validators, DistributionClientImpl distributionClient) { this.validators = validators; this.distributionClient = distributionClient; @@ -55,7 +62,7 @@ public class ClientNotifyCallback implements INotificationCallback { @Override public void activateCallback(INotificationData inotificationData) { logServiceInfo(inotificationData); - artifactsDownloader.pullArtifacts(inotificationData); + pulledArtifacts.addAll(artifactsDownloader.pullArtifacts(inotificationData)); } private void logServiceInfo(INotificationData service) { diff --git a/sdc-distribution-ci/src/test/java/org/onap/test/core/service/ClientInitializerTest.java b/sdc-distribution-ci/src/test/java/org/onap/test/core/service/ClientInitializerTest.java index 40278b1..797009d 100644 --- a/sdc-distribution-ci/src/test/java/org/onap/test/core/service/ClientInitializerTest.java +++ b/sdc-distribution-ci/src/test/java/org/onap/test/core/service/ClientInitializerTest.java @@ -19,6 +19,8 @@ */ package org.onap.test.core.service; +import org.awaitility.Duration; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -26,17 +28,26 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; +import org.onap.sdc.impl.DistributionClientDownloadResultImpl; import org.onap.sdc.impl.DistributionClientImpl; import org.onap.test.core.config.DistributionClientConfig; import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.testcontainers.containers.GenericContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; import static org.mockito.Mockito.verify; @Testcontainers @@ -47,12 +58,16 @@ class ClientInitializerTest { private static final int SUCCESSFUL_UNREGISTER_MSG_INDEX = 3; private static final int SUCCESSFUL_INIT_MSG_INDEX = 0; private static final int SUCCESSFUL_DIST_MSG_INDEX = 3; + private static final int EXPECTED_HEAT_ARTIFACTS = 4; private ClientInitializer clientInitializer; + private ClientNotifyCallback clientNotifyCallback; + private static final Logger testLog = LoggerFactory.getLogger(ClientInitializerTest.class); @Container public GenericContainer mockDmaap = new GenericContainer("registry.gitlab.com/orange-opensource/lfn/onap/mock_servers/mock-dmaap:latest") .withNetworkMode("host"); + @Container public GenericContainer mockSdc = new GenericContainer("registry.gitlab.com/orange-opensource/lfn/onap/mock_servers/mock-sdc:latest") .withNetworkMode("host"); @@ -62,13 +77,14 @@ class ClientInitializerTest { @Mock Logger distClientLog; + @BeforeEach public void initializeClient() { DistributionClientConfig clientConfig = new DistributionClientConfig(); List validators = new ArrayList<>(); DistributionClientImpl client = new DistributionClientImpl(distClientLog); - ClientNotifyCallback callback = new ClientNotifyCallback(validators, client); - clientInitializer = new ClientInitializer(clientConfig, callback, client); + clientNotifyCallback = new ClientNotifyCallback(validators, client); + clientInitializer = new ClientInitializer(clientConfig, clientNotifyCallback, client); } @Test @@ -98,4 +114,28 @@ class ClientInitializerTest { assertThat(allValues.get(SUCCESSFUL_STOP_MSG_INDEX)).isEqualTo("stop DistributionClient"); assertThat(allValues.get(SUCCESSFUL_UNREGISTER_MSG_INDEX)).isEqualTo("client unregistered from topics successfully"); } -} \ No newline at end of file + + @Test + public void shouldDownloadArtifactsWithArtifactTypeHeat() throws IOException, InterruptedException { + + //given + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create("http://localhost:3904/events/testName/add")) + .POST(HttpRequest.BodyPublishers.ofFile(Paths.get("src/test/resources/artifacts.json"))) + .build(); + HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString()); + //when + clientInitializer.initialize(); + waitForArtifacts(); + List calls = clientNotifyCallback.getPulledArtifacts(); + //then + Assertions.assertEquals(EXPECTED_HEAT_ARTIFACTS, calls.size()); + } + + private void waitForArtifacts() { + testLog.info("Waiting for artifacts"); + await() + .atMost(Duration.ONE_MINUTE) + .until(() -> !clientNotifyCallback.getPulledArtifacts().isEmpty()); + } +} diff --git a/sdc-distribution-ci/src/test/resources/artifacts.json b/sdc-distribution-ci/src/test/resources/artifacts.json new file mode 100644 index 0000000..4d4f45d --- /dev/null +++ b/sdc-distribution-ci/src/test/resources/artifacts.json @@ -0,0 +1,170 @@ +{ + "distributionID": "bf3df55e-cdc6-4bf7-b3b3-0fdccab91106", + "serviceName": "demoVLB_CDS", + "serviceVersion": "1.0", + "serviceUUID": "d2192fd5-6ba4-40d2-9078-e3642d9175ee", + "serviceDescription": "catalog service description", + "serviceInvariantUUID": "6f355230-c44b-4aca-873a-41c250b8137c", + "resources": [ + { + "resourceInstanceName": "vLB_CDS 68b6da59-68e4 0", + "resourceName": "vLB_CDS 68b6da59-68e4", + "resourceVersion": "1.0", + "resoucreType": "VF", + "resourceUUID": "acdcb4be-7ec8-4d1f-a6ab-c225e35ee7ed", + "resourceInvariantUUID": "d9309314-be70-46d6-9ac3-fefb5d74fd3a", + "resourceCustomizationUUID": "f163654b-f172-4828-af92-04fc60eabc28", + "category": "Generic", + "subcategory": "Abstract", + "artifacts": [ + { + "artifactName": "k8s-tca-clamp-policy-05082019.yaml", + "artifactType": "DCAE_INVENTORY_BLUEPRINT", + "artifactURL": "/sdc/v1/catalog/services/DemovlbCds/1.0/resourceInstances/vlb_cds68b6da5968e40/artifacts/k8s-tca-clamp-policy-05082019.yaml", + "artifactChecksum": "ZTIyYzkyYzgyYzBkMjc0YWJhNTIzOGI4YWE1Njg3YzA=", + "artifactDescription": "k8s-tca-clamp-policy-05082019.yaml", + "artifactTimeout": 0, + "artifactUUID": "560f355f-00e7-413c-bf56-025c999ae983", + "artifactVersion": "1" + }, + { + "artifactName": "vf-license-model.yaml", + "artifactType": "VF_LICENSE", + "artifactURL": "/sdc/v1/catalog/services/DemovlbCds/1.0/resourceInstances/vlb_cds68b6da5968e40/artifacts/vf-license-model.xml", + "artifactChecksum": "YTc3NjEwZThhMjFjMjlmNDQ0M2FmYzExZDQ0MjQ0Yzc=", + "artifactDescription": "VF license file", + "artifactTimeout": 0, + "artifactUUID": "f1b25b41-334f-40db-afdb-dea1da827316", + "artifactVersion": "1" + }, + { + "artifactName": "base_template.env", + "artifactType": "HEAT_ENV", + "artifactURL": "/sdc/v1/catalog/services/DemovlbCds/1.0/resourceInstances/vlb_cds68b6da5968e40/artifacts/base_template.env", + "artifactChecksum": "NTYzNDIzN2I5MTg1M2Y1MjgyNDdlMzc2NjNiNDVmZWM=", + "artifactDescription": "Auto-generated HEAT Environment deployment artifact", + "artifactTimeout": 0, + "artifactUUID": "2cf083a6-aae1-46b4-89c8-312c6d6abc29", + "artifactVersion": "3", + "generatedFromUUID": "fdfced54-8425-4c51-a913-ab9ac126cc20" + }, + { + "artifactName": "vlb_cds68b6da5968e40_modules.json", + "artifactType": "VF_MODULES_METADATA", + "artifactURL": "/sdc/v1/catalog/services/DemovlbCds/1.0/resourceInstances/vlb_cds68b6da5968e40/artifacts/vlb_cds68b6da5968e40_modules.json", + "artifactChecksum": "YWUzODIzMjczMDAzMGNjZDlhYWIzM2FmNjE3MjY0NTk=", + "artifactDescription": "Auto-generated VF Modules information artifact", + "artifactTimeout": 30, + "artifactUUID": "15f20c8e-c644-4e8f-8a4b-099761e9f05d", + "artifactVersion": "2" + }, + { + "artifactName": "vpkg.yaml", + "artifactType": "HEAT", + "artifactURL": "/", + "artifactChecksum": "MTFkMDYzMGMyZjUyM2Y2ZjA0ZGRlOWFjZmI4ODMyZmQ=", + "artifactDescription": "created from csar", + "artifactTimeout": 30, + "artifactUUID": "eb0c1b54-a71a-43f2-9c8c-95040365d657", + "artifactVersion": "1" + }, + { + "artifactName": "vdns.env", + "artifactType": "HEAT_ENV", + "artifactURL": "/sdc/v1/catalog/services/DemovlbCds/1.0/resourceInstances/vlb_cds68b6da5968e40/artifacts/vdns.env", + "artifactChecksum": "YjA2OGFiN2RiYjJkZGI2YzgwNDdhNmZiNzc0MmIwODQ=", + "artifactDescription": "Auto-generated HEAT Environment deployment artifact", + "artifactTimeout": 0, + "artifactUUID": "1c81a0e7-06f6-49af-ae95-b6ad24e3cad9", + "artifactVersion": "3", + "generatedFromUUID": "95e8b9d6-3456-469b-be14-0904cf0de619" + }, + { + "artifactName": "vendor-license-model.xml", + "artifactType": "VENDOR_LICENSE", + "artifactURL": "/sdc/v1/catalog/services/DemovlbCds/1.0/resourceInstances/vlb_cds68b6da5968e40/artifacts/vendor-license-model.xml", + "artifactChecksum": "ZTQ1N2MxNmZjMmIzMjlhMWRjNGM5MDNjMzkyYzdjMGM=", + "artifactDescription": " Vendor license file", + "artifactTimeout": 0, + "artifactUUID": "dee67b01-bf96-44d6-8565-e6a0cbe98528", + "artifactVersion": "1" + }, + { + "artifactName": "vlb.yaml", + "artifactType": "HEAT", + "artifactURL": "/", + "artifactChecksum": "MDk5ZGUwN2M1NjAzMjY2Yjc1OGM5MGQzYjJkNGQzNTM=", + "artifactDescription": "created from csar", + "artifactTimeout": 30, + "artifactUUID": "6d6bf6d7-e76c-4488-85ad-a7dcc5867d8f", + "artifactVersion": "1" + }, + { + "artifactName": "vlb.env", + "artifactType": "HEAT_ENV", + "artifactURL": "/sdc/v1/catalog/services/DemovlbCds/1.0/resourceInstances/vlb_cds68b6da5968e40/artifacts/vlb.env", + "artifactChecksum": "MzY2MGE3NGNlMjU2ZDk4OTNkNjI0MTAwZjY0ZGE0Y2U=", + "artifactDescription": "Auto-generated HEAT Environment deployment artifact", + "artifactTimeout": 0, + "artifactUUID": "0fe5eb8f-180c-4b50-b73d-ae404141fad1", + "artifactVersion": "3", + "generatedFromUUID": "6d6bf6d7-e76c-4488-85ad-a7dcc5867d8f" + }, + { + "artifactName": "vpkg.env", + "artifactType": "HEAT_ENV", + "artifactURL": "/sdc/v1/catalog/services/DemovlbCds/1.0/resourceInstances/vlb_cds68b6da5968e40/artifacts/vpkg.env", + "artifactChecksum": "NGRkZTVjMWRiYTkyYjM3MmY1MmIzNjAzYTRlMjdmN2I=", + "artifactDescription": "Auto-generated HEAT Environment deployment artifact", + "artifactTimeout": 0, + "artifactUUID": "25d6197f-b465-4ca5-a22c-5ae261c79313", + "artifactVersion": "3", + "generatedFromUUID": "eb0c1b54-a71a-43f2-9c8c-95040365d657" + }, + { + "artifactName": "vdns.yaml", + "artifactType": "HEAT", + "artifactURL": "/", + "artifactChecksum": "YzM5M2M1NjY2ZWYyOGU2MTgyNmIwYmFhZjUzMzdiYzM=", + "artifactDescription": "created from csar", + "artifactTimeout": 30, + "artifactUUID": "95e8b9d6-3456-469b-be14-0904cf0de619", + "artifactVersion": "1" + }, + { + "artifactName": "base_template.yaml", + "artifactType": "HEAT", + "artifactURL": "/", + "artifactChecksum": "MjllZGZkNTU3MTljOTVhNGMwY2FiZDk3MmFmZjAwNmE=", + "artifactDescription": "created from csar", + "artifactTimeout": 30, + "artifactUUID": "fdfced54-8425-4c51-a913-ab9ac126cc20", + "artifactVersion": "1" + } + ] + } + ], + "serviceArtifacts": [ + { + "artifactName": "service-DemovlbCds-template.yml", + "artifactType": "TOSCA_TEMPLATE", + "artifactURL": "/sdc/v1/catalog/services/DemovlbCds/1.0/artifacts/service-DemovlbCds-template.yml", + "artifactChecksum": "YWJiYWQ0MjUxMjk5ZjNmYjk2ODVhZjk3ZDI1ZmViNjk=", + "artifactDescription": "TOSCA representation of the asset", + "artifactTimeout": 0, + "artifactUUID": "ceeb88f4-cd35-437d-8a15-7342a18803bd", + "artifactVersion": "1" + }, + { + "artifactName": "service-DemovlbCds-csar.csar", + "artifactType": "TOSCA_CSAR", + "artifactURL": "/sdc/v1/catalog/services/DemovlbCds/1.0/artifacts/service-DemovlbCds-csar.csar", + "artifactChecksum": "ZmI5NzQ1MWViZGFkMjRjZWEwNTQzY2U0OWQwYjlmYjQ=", + "artifactDescription": "TOSCA definition package of the asset", + "artifactTimeout": 0, + "artifactUUID": "f6f907f1-3f45-4fb4-8cbe-15a4c6ee16db", + "artifactVersion": "1" + } + ], + "workloadContext": "Production" +} \ No newline at end of file diff --git a/sdc-distribution-client/src/main/java/org/onap/sdc/impl/DistributionClientImpl.java b/sdc-distribution-client/src/main/java/org/onap/sdc/impl/DistributionClientImpl.java index b719432..c372642 100644 --- a/sdc-distribution-client/src/main/java/org/onap/sdc/impl/DistributionClientImpl.java +++ b/sdc-distribution-client/src/main/java/org/onap/sdc/impl/DistributionClientImpl.java @@ -186,7 +186,6 @@ public class DistributionClientImpl implements IDistributionClient { List relevantArtifactTypes = configuration.getRelevantArtifactTypes(); // Remove nulls from list - workaround for how configuration is built relevantArtifactTypes.removeAll(Collections.singleton(null)); - NotificationConsumer consumer = new NotificationConsumer(cambriaNotificationConsumer, callback, relevantArtifactTypes, this); executorPool = Executors.newScheduledThreadPool(DistributionClientConstants.POOL_SIZE); executorPool.scheduleAtFixedRate(consumer, 0, configuration.getPollingInterval(), TimeUnit.SECONDS); -- cgit 1.2.3-korg