X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=enrichment-coordinator-service%2Fsrc%2Ftest%2Fjava%2Forg%2Foransc%2Fenrichment%2FApplicationTest.java;h=236ed3eadd52c3bddd50c641196f1201a0272675;hb=b5aa1b04fe2cf730c434e3d5d103b3ab357f2292;hp=4997539c2dd9efdd23801f2013f7a60b16460638;hpb=af40dc43f26d3fea66ac04625080314162e93496;p=nonrtric.git diff --git a/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/ApplicationTest.java b/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/ApplicationTest.java index 4997539c..236ed3ea 100644 --- a/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/ApplicationTest.java +++ b/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/ApplicationTest.java @@ -1,9 +1,9 @@ /*- * ========================LICENSE_START================================= - * ONAP : ccsdk oran - * ====================================================================== - * Copyright (C) 2019-2020 Nordix Foundation. All rights reserved. - * ====================================================================== + * O-RAN-SC + * %% + * Copyright (C) 2020 Nordix Foundation + * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -30,14 +30,19 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonParser; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.PrintStream; import java.util.ArrayList; import java.util.Collection; +import org.json.JSONObject; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.oransc.enrichment.clients.AsyncRestClient; +import org.oransc.enrichment.clients.AsyncRestClientFactory; import org.oransc.enrichment.clients.ProducerJobInfo; import org.oransc.enrichment.configuration.ApplicationConfig; import org.oransc.enrichment.configuration.ImmutableWebClientConfig; @@ -45,15 +50,18 @@ import org.oransc.enrichment.configuration.WebClientConfig; import org.oransc.enrichment.controller.ProducerSimulatorController; import org.oransc.enrichment.controllers.consumer.ConsumerConsts; import org.oransc.enrichment.controllers.consumer.ConsumerEiJobInfo; +import org.oransc.enrichment.controllers.consumer.ConsumerEiTypeInfo; import org.oransc.enrichment.controllers.producer.ProducerConsts; import org.oransc.enrichment.controllers.producer.ProducerRegistrationInfo; import org.oransc.enrichment.controllers.producer.ProducerRegistrationInfo.ProducerEiTypeRegistrationInfo; +import org.oransc.enrichment.controllers.producer.ProducerStatusInfo; import org.oransc.enrichment.exceptions.ServiceException; import org.oransc.enrichment.repository.EiJob; import org.oransc.enrichment.repository.EiJobs; import org.oransc.enrichment.repository.EiProducers; import org.oransc.enrichment.repository.EiType; import org.oransc.enrichment.repository.EiTypes; +import org.oransc.enrichment.tasks.ProducerSupervision; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; @@ -102,6 +110,9 @@ class ApplicationTest { @Autowired ProducerSimulatorController producerSimulator; + @Autowired + ProducerSupervision producerSupervision; + private static Gson gson = new GsonBuilder() // .serializeNulls() // .create(); // @@ -133,6 +144,18 @@ class ApplicationTest { assertThat(this.producerSimulator.getTestResults().errorFound).isFalse(); } + @Test + void createApiDoc() throws FileNotFoundException { + String url = "/v2/api-docs"; + ResponseEntity resp = restClient().getForEntity(url).block(); + assertThat(resp.getStatusCode()).isEqualTo(HttpStatus.OK); + + String indented = (new JSONObject(resp.getBody())).toString(4); + try (PrintStream out = new PrintStream(new FileOutputStream("docs/api.json"))) { + out.print(indented); + } + } + @Test void testGetEiTypes() throws Exception { putEiProducerWithOneType(EI_PRODUCER_ID, "test"); @@ -146,7 +169,8 @@ class ApplicationTest { putEiProducerWithOneType(EI_PRODUCER_ID, "test"); String url = ConsumerConsts.API_ROOT + "/eitypes/test"; String rsp = restClient().get(url).block(); - assertThat(rsp).contains("job_data_schema"); + ConsumerEiTypeInfo info = gson.fromJson(rsp, ConsumerEiTypeInfo.class); + assertThat(info.jobParametersSchema).isNotNull(); } @Test @@ -176,7 +200,8 @@ class ApplicationTest { putEiJob(EI_TYPE_ID, "jobId"); String url = ConsumerConsts.API_ROOT + "/eitypes/typeId/eijobs/jobId"; String rsp = restClient().get(url).block(); - assertThat(rsp).contains("job_data"); + ConsumerEiJobInfo info = gson.fromJson(rsp, ConsumerEiJobInfo.class); + assertThat(info.owner).isEqualTo("owner"); } @Test @@ -204,7 +229,7 @@ class ApplicationTest { assertThat(this.eiJobs.size()).isEqualTo(1); String url = ConsumerConsts.API_ROOT + "/eitypes/typeId/eijobs/jobId"; restClient().delete(url).block(); - assertThat(this.eiJobs.size()).isEqualTo(0); + assertThat(this.eiJobs.size()).isZero(); ProducerSimulatorController.TestResults simulatorResults = this.producerSimulator.getTestResults(); await().untilAsserted(() -> assertThat(simulatorResults.jobsStopped.size()).isEqualTo(1)); @@ -220,7 +245,9 @@ class ApplicationTest { @Test void testPutEiJob() throws Exception { + // Test that one producer accepting a job is enough putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID); + putEiProducerWithOneTypeRejecting("simulateProducerError", EI_TYPE_ID); String url = ConsumerConsts.API_ROOT + "/eitypes/typeId/eijobs/jobId"; String body = gson.toJson(eiJobInfo()); @@ -233,12 +260,25 @@ class ApplicationTest { ProducerJobInfo request = simulatorResults.jobsStarted.get(0); assertThat(request.id).isEqualTo("jobId"); + assertThat(simulatorResults.noOfRejectedCreate).isEqualTo(1); + resp = restClient().putForEntity(url, body).block(); assertThat(resp.getStatusCode()).isEqualTo(HttpStatus.OK); EiJob job = this.eiJobs.getJob("jobId"); assertThat(job.owner()).isEqualTo("owner"); } + @Test + void putEiProducerWithOneType_rejecting() throws JsonMappingException, JsonProcessingException, ServiceException { + putEiProducerWithOneTypeRejecting("simulateProducerError", EI_TYPE_ID); + String url = ConsumerConsts.API_ROOT + "/eitypes/typeId/eijobs/jobId"; + String body = gson.toJson(eiJobInfo()); + testErrorCode(restClient().put(url, body), HttpStatus.CONFLICT, "Job not accepted by any producers"); + + ProducerSimulatorController.TestResults simulatorResults = this.producerSimulator.getTestResults(); + assertThat(simulatorResults.noOfRejectedCreate).isEqualTo(1); + } + @Test void testPutEiJob_jsonSchemavalidationError() throws Exception { putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID); @@ -249,7 +289,7 @@ class ApplicationTest { new ConsumerEiJobInfo(jsonObject("{ \"XXstring\" : \"value\" }"), "owner", "targetUri"); String body = gson.toJson(jobInfo); - testErrorCode(restClient().put(url, body), HttpStatus.NOT_FOUND, "Json validation failure"); + testErrorCode(restClient().put(url, body), HttpStatus.CONFLICT, "Json validation failure"); } @Test @@ -303,10 +343,9 @@ class ApplicationTest { assertThat(this.eiTypes.size()).isEqualTo(1); EiType type = this.eiTypes.getType(EI_TYPE_ID); - assertThat(type.getProducerIds().contains("eiProducerId")).isTrue(); + assertThat(type.getProducerIds()).contains("eiProducerId"); assertThat(this.eiProducers.size()).isEqualTo(1); - assertThat(this.eiProducers.get("eiProducerId").eiTypes().iterator().next().getId().equals(EI_TYPE_ID)) - .isTrue(); + assertThat(this.eiProducers.get("eiProducerId").getEiTypes().iterator().next().getId()).isEqualTo(EI_TYPE_ID); resp = restClient().putForEntity(url, body).block(); assertThat(resp.getStatusCode()).isEqualTo(HttpStatus.OK); @@ -370,27 +409,80 @@ class ApplicationTest { @Test void testDeleteEiProducer() throws Exception { - String url = ProducerConsts.API_ROOT + "/eiproducers/eiProducerId"; - String url2 = ProducerConsts.API_ROOT + "/eiproducers/eiProducerId2"; - String body = gson.toJson(producerEiRegistratioInfo(EI_TYPE_ID)); - restClient().putForEntity(url, body).block(); - restClient().putForEntity(url2, body).block(); + putEiProducerWithOneType("eiProducerId", EI_TYPE_ID); + putEiProducerWithOneType("eiProducerId2", EI_TYPE_ID); + assertThat(this.eiProducers.size()).isEqualTo(2); EiType type = this.eiTypes.getType(EI_TYPE_ID); - assertThat(type.getProducerIds().contains("eiProducerId")).isTrue(); - assertThat(type.getProducerIds().contains("eiProducerId2")).isTrue(); + assertThat(type.getProducerIds()).contains("eiProducerId"); + assertThat(type.getProducerIds()).contains("eiProducerId2"); putEiJob(EI_TYPE_ID, "jobId"); assertThat(this.eiJobs.size()).isEqualTo(1); + String url = ProducerConsts.API_ROOT + "/eiproducers/eiProducerId"; restClient().deleteForEntity(url).block(); assertThat(this.eiProducers.size()).isEqualTo(1); - assertThat(this.eiTypes.getType(EI_TYPE_ID).getProducerIds().contains("eiProducerId")).isFalse(); + assertThat(this.eiTypes.getType(EI_TYPE_ID).getProducerIds()).doesNotContain("eiProducerId"); assertThat(this.eiJobs.size()).isEqualTo(1); + String url2 = ProducerConsts.API_ROOT + "/eiproducers/eiProducerId2"; restClient().deleteForEntity(url2).block(); + assertThat(this.eiProducers.size()).isZero(); + assertThat(this.eiTypes.size()).isZero(); + assertThat(this.eiJobs.size()).isZero(); + } + + @Test + void testGetProducerEiType() throws JsonMappingException, JsonProcessingException, ServiceException { + putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID); + String url = ProducerConsts.API_ROOT + "/eitypes/" + EI_TYPE_ID; + ResponseEntity resp = restClient().getForEntity(url).block(); + assertThat(resp.getBody()).contains(EI_PRODUCER_ID); + } + + @Test + void testGetProducerIdentifiers() throws JsonMappingException, JsonProcessingException, ServiceException { + putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID); + String url = ProducerConsts.API_ROOT + "/eiproducers"; + ResponseEntity resp = restClient().getForEntity(url).block(); + assertThat(resp.getBody()).contains(EI_PRODUCER_ID); + } + + private void assertProducerOpState(String producerId, + ProducerStatusInfo.OperationalState expectedOperationalState) { + String statusUrl = ProducerConsts.API_ROOT + "/eiproducers/" + producerId + "/status"; + ResponseEntity resp = restClient().getForEntity(statusUrl).block(); + ProducerStatusInfo statusInfo = gson.fromJson(resp.getBody(), ProducerStatusInfo.class); + assertThat(statusInfo.opState).isEqualTo(expectedOperationalState); + } + + @Test + void testProducerSupervision() throws JsonMappingException, JsonProcessingException, ServiceException { + putEiProducerWithOneTypeRejecting("simulateProducerError", EI_TYPE_ID); + + assertThat(this.eiProducers.size()).isEqualTo(1); + assertThat(this.eiTypes.size()).isEqualTo(1); + assertProducerOpState("simulateProducerError", ProducerStatusInfo.OperationalState.ENABLED); + + this.producerSupervision.createTask().blockLast(); + this.producerSupervision.createTask().blockLast(); + assertThat(this.eiProducers.size()).isEqualTo(1); + assertProducerOpState("simulateProducerError", ProducerStatusInfo.OperationalState.DISABLED); + + // After 3 failed checks, the producer shall be deregisterred + this.producerSupervision.createTask().blockLast(); assertThat(this.eiProducers.size()).isEqualTo(0); assertThat(this.eiTypes.size()).isEqualTo(0); - assertThat(this.eiJobs.size()).isEqualTo(0); + } + + @Test + void testGetStatus() throws JsonMappingException, JsonProcessingException, ServiceException { + putEiProducerWithOneTypeRejecting("simulateProducerError", EI_TYPE_ID); + putEiProducerWithOneTypeRejecting("simulateProducerError2", EI_TYPE_ID); + + String url = "/status"; + ResponseEntity resp = restClient().getForEntity(url).block(); + assertThat(resp.getBody()).contains("hunky dory"); } ProducerEiTypeRegistrationInfo producerEiTypeRegistrationInfo(String typeId) @@ -398,12 +490,24 @@ class ApplicationTest { return new ProducerEiTypeRegistrationInfo(jsonSchemaObject(), typeId); } + ProducerRegistrationInfo producerEiRegistratioInfoRejecting(String typeId) + throws JsonMappingException, JsonProcessingException { + Collection types = new ArrayList<>(); + types.add(producerEiTypeRegistrationInfo(typeId)); + return new ProducerRegistrationInfo(types, // + baseUrl() + ProducerSimulatorController.JOB_CREATED_ERROR_URL, + baseUrl() + ProducerSimulatorController.JOB_DELETED_ERROR_URL, + baseUrl() + ProducerSimulatorController.SUPERVISION_ERROR_URL); + } + ProducerRegistrationInfo producerEiRegistratioInfo(String typeId) throws JsonMappingException, JsonProcessingException { Collection types = new ArrayList<>(); types.add(producerEiTypeRegistrationInfo(typeId)); - return new ProducerRegistrationInfo(types, baseUrl() + ProducerSimulatorController.JOB_CREATED_URL, - baseUrl() + ProducerSimulatorController.JOB_DELETED_URL); + return new ProducerRegistrationInfo(types, // + baseUrl() + ProducerSimulatorController.JOB_CREATED_URL, + baseUrl() + ProducerSimulatorController.JOB_DELETED_URL, + baseUrl() + ProducerSimulatorController.SUPERVISION_URL); } ConsumerEiJobInfo eiJobInfo() throws JsonMappingException, JsonProcessingException { @@ -449,6 +553,15 @@ class ApplicationTest { return this.eiJobs.getJob(jobId); } + private EiType putEiProducerWithOneTypeRejecting(String producerId, String eiTypeId) + throws JsonMappingException, JsonProcessingException, ServiceException { + String url = ProducerConsts.API_ROOT + "/eiproducers/" + producerId; + String body = gson.toJson(producerEiRegistratioInfoRejecting(eiTypeId)); + + restClient().putForEntity(url, body).block(); + return this.eiTypes.getType(eiTypeId); + } + private EiType putEiProducerWithOneType(String producerId, String eiTypeId) throws JsonMappingException, JsonProcessingException, ServiceException { String url = ProducerConsts.API_ROOT + "/eiproducers/" + producerId; @@ -474,7 +587,8 @@ class ApplicationTest { .trustStorePassword(config.trustStorePassword()) // .build(); - return new AsyncRestClient(baseUrl(), config); + AsyncRestClientFactory restClientFactory = new AsyncRestClientFactory(config); + return restClientFactory.createRestClient(baseUrl()); } private AsyncRestClient restClient() {