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=d0828357c5363d2386137566d580542fd5b84fee;hb=e912ee4367d6a305ac038c86dec816b5ce71191b;hp=c5ee82aa3bee26d090fa054a4da88f9f81a3c530;hpb=e8cc7ee89c17cb18c0802bd3a6afe8031217b2ab;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 c5ee82aa..d0828357 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 @@ -34,8 +34,7 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintStream; import java.lang.invoke.MethodHandles; -import java.util.ArrayList; -import java.util.Collection; +import java.util.Arrays; import org.json.JSONObject; import org.junit.jupiter.api.AfterEach; @@ -45,15 +44,19 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.oransc.enrichment.clients.AsyncRestClient; import org.oransc.enrichment.clients.AsyncRestClientFactory; import org.oransc.enrichment.configuration.ApplicationConfig; +import org.oransc.enrichment.configuration.ImmutableHttpProxyConfig; import org.oransc.enrichment.configuration.ImmutableWebClientConfig; import org.oransc.enrichment.configuration.WebClientConfig; +import org.oransc.enrichment.configuration.WebClientConfig.HttpProxyConfig; import org.oransc.enrichment.controller.ConsumerSimulatorController; 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.ConsumerEiJobStatus; import org.oransc.enrichment.controllers.consumer.ConsumerEiTypeInfo; +import org.oransc.enrichment.controllers.producer.ProducerCallbacks; import org.oransc.enrichment.controllers.producer.ProducerConsts; +import org.oransc.enrichment.controllers.producer.ProducerEiTypeInfo; import org.oransc.enrichment.controllers.producer.ProducerJobInfo; import org.oransc.enrichment.controllers.producer.ProducerRegistrationInfo; import org.oransc.enrichment.controllers.producer.ProducerRegistrationInfo.ProducerEiTypeRegistrationInfo; @@ -125,6 +128,9 @@ class ApplicationTest { @Autowired ProducerSupervision producerSupervision; + @Autowired + ProducerCallbacks producerCallbacks; + private static Gson gson = new GsonBuilder().create(); /** @@ -161,8 +167,10 @@ class ApplicationTest { 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/offeredapis/swagger/ecs-api.json"))) { + JSONObject jsonObj = new JSONObject(resp.getBody()); + jsonObj.remove("host"); + String indented = jsonObj.toString(4); + try (PrintStream out = new PrintStream(new FileOutputStream("api/ecs-api.json"))) { out.print(indented); } } @@ -182,6 +190,12 @@ class ApplicationTest { assertThat(rsp).isEqualTo("[]"); } + @Test + void testPutEiType() throws JsonMappingException, JsonProcessingException, ServiceException { + assertThat(putEiType(EI_TYPE_ID)).isEqualTo(HttpStatus.CREATED); + assertThat(putEiType(EI_TYPE_ID)).isEqualTo(HttpStatus.OK); + } + @Test void testGetEiType() throws Exception { putEiProducerWithOneType(EI_PRODUCER_ID, "test"); @@ -191,10 +205,29 @@ class ApplicationTest { assertThat(info).isNotNull(); } + @Test + void testDeleteEiType() throws Exception { + putEiType(EI_TYPE_ID); + String url = ProducerConsts.API_ROOT + "/eitypes/" + EI_TYPE_ID; + restClient().delete(url).block(); + assertThat(this.eiTypes.size()).isEqualTo(0); + + testErrorCode(restClient().delete(url), HttpStatus.NOT_FOUND, "EI type not found"); + } + + @Test + void testDeleteEiTypeExistingProducer() throws Exception { + putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID); + String url = ProducerConsts.API_ROOT + "/eitypes/" + EI_TYPE_ID; + testErrorCode(restClient().delete(url), HttpStatus.NOT_ACCEPTABLE, + "The type has active producers: " + EI_PRODUCER_ID); + assertThat(this.eiTypes.size()).isEqualTo(1); + } + @Test void testGetEiTypeNotFound() throws Exception { String url = ConsumerConsts.API_ROOT + "/eitypes/junk"; - testErrorCode(restClient().get(url), HttpStatus.NOT_FOUND, "Could not find EI type: junk"); + testErrorCode(restClient().get(url), HttpStatus.NOT_FOUND, "EI type not found: junk"); } @Test @@ -299,19 +332,24 @@ class ApplicationTest { assertThat(resp.getStatusCode()).isEqualTo(HttpStatus.OK); EiJob job = this.eiJobs.getJob("jobId"); assertThat(job.getOwner()).isEqualTo("owner"); + + verifyJobStatus(EI_JOB_ID, "ENABLED"); } @Test void putEiProducerWithOneType_rejecting() throws JsonMappingException, JsonProcessingException, ServiceException { putEiProducerWithOneTypeRejecting("simulateProducerError", EI_TYPE_ID); - String url = ConsumerConsts.API_ROOT + "/eijobs/jobId"; + String url = ConsumerConsts.API_ROOT + "/eijobs/" + EI_JOB_ID; String body = gson.toJson(eiJobInfo()); - testErrorCode(restClient().put(url, body), HttpStatus.CONFLICT, "Job not accepted by any producers"); + restClient().put(url, body).block(); ProducerSimulatorController.TestResults simulatorResults = this.producerSimulator.getTestResults(); // There is one retry -> 2 calls await().untilAsserted(() -> assertThat(simulatorResults.noOfRejectedCreate).isEqualTo(2)); assertThat(simulatorResults.noOfRejectedCreate).isEqualTo(2); + + verifyJobStatus(EI_JOB_ID, "DISABLED"); + } @Test @@ -342,20 +380,6 @@ class ApplicationTest { assertThat(resp.getBody()).contains(EI_TYPE_ID_2); } - @Test - void testReplacingEiProducerTypes() throws Exception { - final String REPLACED_TYPE_ID = "replaced"; - putEiProducerWithOneType(EI_PRODUCER_ID, REPLACED_TYPE_ID); - putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID); - - String url = ProducerConsts.API_ROOT + "/eitypes"; - - ResponseEntity resp = restClient().getForEntity(url).block(); - assertThat(resp.getStatusCode()).isEqualTo(HttpStatus.OK); - assertThat(resp.getBody()).contains(EI_TYPE_ID); - assertThat(resp.getBody()).doesNotContain(REPLACED_TYPE_ID); - } - @Test void testChangingEiTypeGetRejected() throws Exception { putEiProducerWithOneType("producer1", "typeId1"); @@ -370,6 +394,7 @@ class ApplicationTest { @Test void testPutEiProducer() throws Exception { + this.putEiType(EI_TYPE_ID); String url = ProducerConsts.API_ROOT + "/eiproducers/eiProducerId"; String body = gson.toJson(producerEiRegistratioInfo(EI_TYPE_ID)); @@ -377,8 +402,7 @@ class ApplicationTest { assertThat(resp.getStatusCode()).isEqualTo(HttpStatus.CREATED); assertThat(this.eiTypes.size()).isEqualTo(1); - EiType type = this.eiTypes.getType(EI_TYPE_ID); - assertThat(type.getProducerIds()).contains("eiProducerId"); + assertThat(this.eiProducers.getProducersForType(EI_TYPE_ID).size()).isEqualTo(1); assertThat(this.eiProducers.size()).isEqualTo(1); assertThat(this.eiProducers.get("eiProducerId").getEiTypes().iterator().next().getId()).isEqualTo(EI_TYPE_ID); @@ -406,6 +430,7 @@ class ApplicationTest { @Test void testPutProducerAndEiJob() throws Exception { + this.putEiType(EI_TYPE_ID); String url = ProducerConsts.API_ROOT + "/eiproducers/eiProducerId"; String body = gson.toJson(producerEiRegistratioInfo(EI_TYPE_ID)); restClient().putForEntity(url, body).block(); @@ -449,19 +474,19 @@ class ApplicationTest { assertThat(this.eiProducers.size()).isEqualTo(2); EiType type = this.eiTypes.getType(EI_TYPE_ID); - assertThat(type.getProducerIds()).contains("eiProducerId"); - assertThat(type.getProducerIds()).contains("eiProducerId2"); + assertThat(this.eiProducers.getProducerIdsForType(type.getId())).contains("eiProducerId"); + assertThat(this.eiProducers.getProducerIdsForType(type.getId())).contains("eiProducerId2"); putEiJob(EI_TYPE_ID, "jobId"); assertThat(this.eiJobs.size()).isEqualTo(1); deleteEiProducer("eiProducerId"); assertThat(this.eiProducers.size()).isEqualTo(1); - assertThat(this.eiTypes.getType(EI_TYPE_ID).getProducerIds()).doesNotContain("eiProducerId"); + assertThat(this.eiProducers.getProducerIdsForType(EI_TYPE_ID)).doesNotContain("eiProducerId"); verifyJobStatus("jobId", "ENABLED"); deleteEiProducer("eiProducerId2"); assertThat(this.eiProducers.size()).isZero(); - assertThat(this.eiTypes.size()).isZero(); + assertThat(this.eiTypes.size()).isEqualTo(1); verifyJobStatus("jobId", "DISABLED"); } @@ -478,7 +503,7 @@ class ApplicationTest { deleteEiProducer("eiProducerId2"); assertThat(this.eiTypes.size()).isEqualTo(1); // The type remains, one producer left deleteEiProducer("eiProducerId"); - assertThat(this.eiTypes.size()).isZero(); // The type is gone + assertThat(this.eiTypes.size()).isEqualTo(1); // The type remains assertThat(this.eiJobs.size()).isEqualTo(1); // The job remains await().untilAsserted(() -> assertThat(consumerCalls.status.size()).isEqualTo(1)); assertThat(consumerCalls.status.get(0).state).isEqualTo(ConsumerEiJobStatus.EiJobStatusValues.DISABLED); @@ -496,7 +521,7 @@ class ApplicationTest { putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID); putEiJob(EI_TYPE_ID, EI_JOB_ID); - // change the type for the producer, the EI_TYPE_ID is deleted + // change the type for the producer, the job shall be disabled putEiProducerWithOneType(EI_PRODUCER_ID, "junk"); verifyJobStatus(EI_JOB_ID, "DISABLED"); ConsumerSimulatorController.TestResults consumerCalls = this.consumerSimulator.getTestResults(); @@ -514,7 +539,8 @@ class ApplicationTest { 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); + ProducerEiTypeInfo info = gson.fromJson(resp.getBody(), ProducerEiTypeInfo.class); + assertThat(info.jobDataSchema).isNotNull(); } @Test @@ -523,6 +549,14 @@ class ApplicationTest { String url = ProducerConsts.API_ROOT + "/eiproducers"; ResponseEntity resp = restClient().getForEntity(url).block(); assertThat(resp.getBody()).contains(EI_PRODUCER_ID); + + url = ProducerConsts.API_ROOT + "/eiproducers?ei_type_id=" + EI_TYPE_ID; + resp = restClient().getForEntity(url).block(); + assertThat(resp.getBody()).contains(EI_PRODUCER_ID); + + url = ProducerConsts.API_ROOT + "/eiproducers?ei_type_id=junk"; + resp = restClient().getForEntity(url).block(); + assertThat(resp.getBody()).isEqualTo("[]"); } @Test @@ -533,9 +567,16 @@ class ApplicationTest { // Create a job putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID); putEiJob(EI_TYPE_ID, EI_JOB_ID); + verifyJobStatus(EI_JOB_ID, "ENABLED"); deleteEiProducer(EI_PRODUCER_ID); + verifyJobStatus(EI_JOB_ID, "DISABLED"); } + // Job disabled status notification shall be received + ConsumerSimulatorController.TestResults consumerResults = this.consumerSimulator.getTestResults(); + await().untilAsserted(() -> assertThat(consumerResults.status.size()).isEqualTo(1)); + assertThat(consumerResults.status.get(0).state).isEqualTo(ConsumerEiJobStatus.EiJobStatusValues.DISABLED); + assertThat(this.eiProducers.size()).isEqualTo(1); assertThat(this.eiTypes.size()).isEqualTo(1); assertProducerOpState("simulateProducerError", ProducerStatusInfo.OperationalState.ENABLED); @@ -543,22 +584,15 @@ class ApplicationTest { this.producerSupervision.createTask().blockLast(); this.producerSupervision.createTask().blockLast(); - // Now we have one producer that is disabled, but the job will be enabled until - // the producer/type is removed + // Now we have one producer that is disabled assertThat(this.eiProducers.size()).isEqualTo(1); assertProducerOpState("simulateProducerError", ProducerStatusInfo.OperationalState.DISABLED); - verifyJobStatus(EI_JOB_ID, "ENABLED"); // After 3 failed checks, the producer and the type shall be deregisterred this.producerSupervision.createTask().blockLast(); - assertThat(this.eiProducers.size()).isEqualTo(0); - assertThat(this.eiTypes.size()).isEqualTo(0); - verifyJobStatus(EI_JOB_ID, "DISABLED"); + assertThat(this.eiProducers.size()).isEqualTo(0); // The producer is removed + assertThat(this.eiTypes.size()).isEqualTo(1); // The type remains - // Job disabled status notification shall be received - ConsumerSimulatorController.TestResults consumerResults = this.consumerSimulator.getTestResults(); - await().untilAsserted(() -> assertThat(consumerResults.status.size()).isEqualTo(1)); - assertThat(consumerResults.status.get(0).state).isEqualTo(ConsumerEiJobStatus.EiJobStatusValues.DISABLED); } @Test @@ -581,21 +615,49 @@ class ApplicationTest { { // Restore the jobs - EiJobs jobs = new EiJobs(this.applicationConfig); + EiJobs jobs = new EiJobs(this.applicationConfig, this.producerCallbacks); jobs.restoreJobsFromDatabase(); assertThat(jobs.size()).isEqualTo(2); - jobs.remove("jobId1"); - jobs.remove("jobId2"); + jobs.remove("jobId1", this.eiProducers); + jobs.remove("jobId2", this.eiProducers); } { // Restore the jobs, no jobs in database - EiJobs jobs = new EiJobs(this.applicationConfig); + EiJobs jobs = new EiJobs(this.applicationConfig, this.producerCallbacks); jobs.restoreJobsFromDatabase(); assertThat(jobs.size()).isEqualTo(0); } logger.warn("Test removing a job when the db file is gone"); - this.eiJobs.remove("jobId1"); + this.eiJobs.remove("jobId1", this.eiProducers); assertThat(this.eiJobs.size()).isEqualTo(1); + + ProducerSimulatorController.TestResults simulatorResults = this.producerSimulator.getTestResults(); + await().untilAsserted(() -> assertThat(simulatorResults.jobsStopped.size()).isEqualTo(3)); + } + + @Test + void testEiTypesDatabase() throws Exception { + putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID); + + assertThat(this.eiTypes.size()).isEqualTo(1); + + { + // Restore the types + EiTypes types = new EiTypes(this.applicationConfig); + types.restoreTypesFromDatabase(); + assertThat(types.size()).isEqualTo(1); + + } + { + // Restore the jobs, no jobs in database + EiTypes types = new EiTypes(this.applicationConfig); + types.clear(); + types.restoreTypesFromDatabase(); + assertThat(types.size()).isEqualTo(0); + } + logger.warn("Test removing a job when the db file is gone"); + this.eiTypes.remove(this.eiTypes.getType(EI_TYPE_ID)); + assertThat(this.eiJobs.size()).isEqualTo(0); } private void deleteEiProducer(String eiProducerId) { @@ -624,18 +686,14 @@ class ApplicationTest { ProducerRegistrationInfo producerEiRegistratioInfoRejecting(String typeId) throws JsonMappingException, JsonProcessingException { - Collection types = new ArrayList<>(); - types.add(producerEiTypeRegistrationInfo(typeId)); - return new ProducerRegistrationInfo(types, // + return new ProducerRegistrationInfo(Arrays.asList(typeId), // baseUrl() + ProducerSimulatorController.JOB_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, // + return new ProducerRegistrationInfo(Arrays.asList(typeId), // baseUrl() + ProducerSimulatorController.JOB_URL, baseUrl() + ProducerSimulatorController.SUPERVISION_URL); } @@ -687,21 +745,34 @@ class ApplicationTest { return this.eiJobs.getJob(jobId); } + private HttpStatus putEiType(String eiTypeId) + throws JsonMappingException, JsonProcessingException, ServiceException { + String url = ProducerConsts.API_ROOT + "/eitypes/" + eiTypeId; + String body = gson.toJson(producerEiTypeRegistrationInfo(eiTypeId)); + ResponseEntity resp = restClient().putForEntity(url, body).block(); + this.eiTypes.getType(eiTypeId); + return resp.getStatusCode(); + + } + private EiType putEiProducerWithOneTypeRejecting(String producerId, String eiTypeId) throws JsonMappingException, JsonProcessingException, ServiceException { + this.putEiType(eiTypeId); 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 { + this.putEiType(eiTypeId); + String url = ProducerConsts.API_ROOT + "/eiproducers/" + producerId; String body = gson.toJson(producerEiRegistratioInfo(eiTypeId)); restClient().putForEntity(url, body).block(); + return this.eiTypes.getType(eiTypeId); } @@ -711,6 +782,10 @@ class ApplicationTest { private AsyncRestClient restClient(boolean useTrustValidation) { WebClientConfig config = this.applicationConfig.getWebClientConfig(); + HttpProxyConfig httpProxyConfig = ImmutableHttpProxyConfig.builder() // + .httpProxyHost("") // + .httpProxyPort(0) // + .build(); config = ImmutableWebClientConfig.builder() // .keyStoreType(config.keyStoreType()) // .keyStorePassword(config.keyStorePassword()) // @@ -719,10 +794,10 @@ class ApplicationTest { .isTrustStoreUsed(useTrustValidation) // .trustStore(config.trustStore()) // .trustStorePassword(config.trustStorePassword()) // - .build(); + .httpProxyConfig(httpProxyConfig).build(); AsyncRestClientFactory restClientFactory = new AsyncRestClientFactory(config); - return restClientFactory.createRestClient(baseUrl()); + return restClientFactory.createRestClientNoHttpProxy(baseUrl()); } private AsyncRestClient restClient() {