@PathVariable("eiProducerId") String eiProducerId, //
@RequestBody ProducerRegistrationInfo registrationInfo) {
try {
- final EiProducer previousDefinition = this.eiProducers.get(eiProducerId);
+ EiProducer previousDefinition = this.eiProducers.get(eiProducerId);
if (previousDefinition != null) {
- deregisterProducer(previousDefinition, false);
+ for (EiType type : previousDefinition.eiTypes()) {
+ type.removeProducer(previousDefinition);
+ }
}
registerProducer(eiProducerId, registrationInfo);
+ if (previousDefinition != null) {
+ purgeTypes(previousDefinition.eiTypes());
+ }
return new ResponseEntity<>(previousDefinition == null ? HttpStatus.CREATED : HttpStatus.OK);
} catch (Exception e) {
}
}
+ private void purgeTypes(Collection<EiType> types) {
+ for (EiType type : types) {
+ if (type.getProducerIds().isEmpty()) {
+ this.deregisterType(type);
+ }
+ }
+ }
+
@DeleteMapping(
path = ProducerConsts.API_ROOT + "/eiproducers/{eiProducerId}",
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Object> deleteEiProducer(@PathVariable("eiProducerId") String eiProducerId) {
try {
final EiProducer producer = this.eiProducers.getProducer(eiProducerId);
- deregisterProducer(producer, true);
+ deregisterProducer(producer);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
} catch (Exception e) {
return ErrorResponse.create(e, HttpStatus.NOT_FOUND);
.build();
}
- private void registerProducer(String producerId, ProducerRegistrationInfo registrationInfo) {
+ private EiProducer registerProducer(String producerId, ProducerRegistrationInfo registrationInfo) {
ArrayList<EiType> types = new ArrayList<>();
for (ProducerEiTypeRegistrationInfo typeInfo : registrationInfo.types) {
types.add(registerType(typeInfo));
}
type.addProducer(producer);
}
+ return producer;
+ }
+
+ private void deregisterType(EiType type) {
+ this.eiTypes.remove(type);
+ for (EiJob job : this.eiJobs.getJobsForType(type.getId())) {
+ this.eiJobs.remove(job);
+ this.logger.warn("Deleted job {} because no producers left", job.id());
+ }
}
- private void deregisterProducer(EiProducer producer, boolean deleteJobs) {
+ private void deregisterProducer(EiProducer producer) {
this.eiProducers.remove(producer);
for (EiType type : producer.eiTypes()) {
boolean removed = type.removeProducer(producer) != null;
if (!removed) {
this.logger.error("Bug, no producer found");
}
- if (type.getProducerIds().isEmpty() && deleteJobs) {
- this.eiTypes.remove(type);
- for (EiJob job : this.eiJobs.getJobsForType(type.getId())) {
- this.eiJobs.remove(job);
- this.logger.warn("Deleted job {} because no producers left", job.id());
- }
+ if (type.getProducerIds().isEmpty()) {
+ deregisterType(type);
}
}
}
import org.oransc.enrichment.repository.EiProducers;
import org.oransc.enrichment.repository.EiType;
import org.oransc.enrichment.repository.EiTypes;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
"server.ssl.key-store=./config/keystore.jks", //
"app.webclient.trust-store=./config/truststore.jks"})
class ApplicationTest {
- private static final Logger logger = LoggerFactory.getLogger(ApplicationTest.class);
private final String EI_TYPE_ID = "typeId";
+ private final String EI_PRODUCER_ID = "producerId";
private final String EI_JOB_PROPERTY = "\"property1\"";
@Autowired
@Test
void testGetEiTypes() throws Exception {
- putEiProducerWithOneType("test");
+ putEiProducerWithOneType(EI_PRODUCER_ID, "test");
String url = ConsumerConsts.API_ROOT + "/eitypes";
String rsp = restClient().get(url).block();
assertThat(rsp).isEqualTo("[\"test\"]");
@Test
void testGetEiType() throws Exception {
- putEiProducerWithOneType("test");
+ putEiProducerWithOneType(EI_PRODUCER_ID, "test");
String url = ConsumerConsts.API_ROOT + "/eitypes/test";
String rsp = restClient().get(url).block();
assertThat(rsp).contains("job_data_schema");
@Test
void testGetEiJobsIds() throws Exception {
- putEiProducerWithOneType(EI_TYPE_ID);
+ putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID);
putEiJob(EI_TYPE_ID, "jobId");
String url = ConsumerConsts.API_ROOT + "/eitypes/typeId/eijobs";
String rsp = restClient().get(url).block();
@Test
void testGetEiJob() throws Exception {
- putEiProducerWithOneType(EI_TYPE_ID);
+ putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID);
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");
}
+ @Test
+ void testGetEiJobNotFound() throws Exception {
+ putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID);
+ String url = ConsumerConsts.API_ROOT + "/eitypes/typeId/eijobs/junk";
+ testErrorCode(restClient().get(url), HttpStatus.NOT_FOUND, "Could not find EI job: junk");
+ }
+
@Test
void testGetEiJobStatus() throws Exception {
- putEiProducerWithOneType(EI_TYPE_ID);
+ putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID);
putEiJob(EI_TYPE_ID, "jobId");
String url = ConsumerConsts.API_ROOT + "/eitypes/typeId/eijobs/jobId/status";
String rsp = restClient().get(url).block();
@Test
void testDeleteEiJob() throws Exception {
- putEiProducerWithOneType(EI_TYPE_ID);
+ putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID);
putEiJob(EI_TYPE_ID, "jobId");
assertThat(this.eiJobs.size()).isEqualTo(1);
String url = ConsumerConsts.API_ROOT + "/eitypes/typeId/eijobs/jobId";
assertThat(simulatorResults.jobsStopped.get(0).id).isEqualTo("jobId");
}
+ @Test
+ void testDeleteEiJobNotFound() throws Exception {
+ putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID);
+ String url = ConsumerConsts.API_ROOT + "/eitypes/typeId/eijobs/junk";
+ testErrorCode(restClient().get(url), HttpStatus.NOT_FOUND, "Could not find EI job: junk");
+ }
+
@Test
void testPutEiJob() throws Exception {
- putEiProducerWithOneType(EI_TYPE_ID);
+ putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID);
String url = ConsumerConsts.API_ROOT + "/eitypes/typeId/eijobs/jobId";
String body = gson.toJson(eiJobInfo());
@Test
void testPutEiJob_jsonSchemavalidationError() throws Exception {
- putEiProducerWithOneType(EI_TYPE_ID);
+ putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID);
String url = ConsumerConsts.API_ROOT + "/eitypes/typeId/eijobs/jobId";
// The element with name "property1" is mandatory in the schema
@Test
void testGetEiProducerTypes() throws Exception {
- putEiProducerWithOneType(EI_TYPE_ID);
+ final String EI_TYPE_ID_2 = EI_TYPE_ID + "_2";
+ putEiProducerWithOneType("producer1", EI_TYPE_ID);
putEiJob(EI_TYPE_ID, "jobId");
+ putEiProducerWithOneType("producer2", EI_TYPE_ID_2);
+ putEiJob(EI_TYPE_ID_2, "jobId2");
String url = ProducerConsts.API_ROOT + "/eitypes";
ResponseEntity<String> resp = restClient().getForEntity(url).block();
assertThat(resp.getStatusCode()).isEqualTo(HttpStatus.OK);
+ assertThat(resp.getBody()).contains(EI_TYPE_ID);
+ 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<String> 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");
+ putEiProducerWithOneType("producer2", "typeId2");
+ putEiJob("typeId1", "jobId");
+
+ String url = ConsumerConsts.API_ROOT + "/eitypes/typeId2/eijobs/jobId";
+ String body = gson.toJson(eiJobInfo());
+ testErrorCode(restClient().put(url, body), HttpStatus.CONFLICT,
+ "Not allowed to change type for existing EI job");
}
@Test
@Test
void testPutEiProducerExistingJob() throws Exception {
- putEiProducerWithOneType(EI_TYPE_ID);
+ putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID);
putEiJob(EI_TYPE_ID, "jobId");
String url = ProducerConsts.API_ROOT + "/eiproducers/eiProducerId";
String body = gson.toJson(producerEiRegistratioInfo(EI_TYPE_ID));
@Test
void testGetEiJobsForProducer() throws JsonMappingException, JsonProcessingException, ServiceException {
- putEiProducerWithOneType(EI_TYPE_ID);
+ putEiProducerWithOneType(EI_PRODUCER_ID, EI_TYPE_ID);
putEiJob(EI_TYPE_ID, "jobId1");
putEiJob(EI_TYPE_ID, "jobId2");
EiType type = this.eiTypes.getType(EI_TYPE_ID);
assertThat(type.getProducerIds().contains("eiProducerId")).isTrue();
assertThat(type.getProducerIds().contains("eiProducerId2")).isTrue();
+ putEiJob(EI_TYPE_ID, "jobId");
+ assertThat(this.eiJobs.size()).isEqualTo(1);
restClient().deleteForEntity(url).block();
assertThat(this.eiProducers.size()).isEqualTo(1);
assertThat(this.eiTypes.getType(EI_TYPE_ID).getProducerIds().contains("eiProducerId")).isFalse();
+ assertThat(this.eiJobs.size()).isEqualTo(1);
restClient().deleteForEntity(url2).block();
assertThat(this.eiProducers.size()).isEqualTo(0);
assertThat(this.eiTypes.size()).isEqualTo(0);
+ assertThat(this.eiJobs.size()).isEqualTo(0);
}
ProducerEiTypeRegistrationInfo producerEiTypeRegistrationInfo(String typeId)
private EiJob putEiJob(String eiTypeId, String jobId)
throws JsonMappingException, JsonProcessingException, ServiceException {
- String url = ConsumerConsts.API_ROOT + "/eitypes/typeId/eijobs/" + jobId;
+ String url = ConsumerConsts.API_ROOT + "/eitypes/" + eiTypeId + "/eijobs/" + jobId;
String body = gson.toJson(eiJobInfo());
restClient().putForEntity(url, body).block();
return this.eiJobs.getJob(jobId);
}
- private EiType putEiProducerWithOneType(String eiTypeId)
+ private EiType putEiProducerWithOneType(String producerId, String eiTypeId)
throws JsonMappingException, JsonProcessingException, ServiceException {
- String url = ProducerConsts.API_ROOT + "/eiproducers/eiProducerId";
+ String url = ProducerConsts.API_ROOT + "/eiproducers/" + producerId;
String body = gson.toJson(producerEiRegistratioInfo(eiTypeId));
restClient().putForEntity(url, body).block();
- assertThat(this.eiTypes.size()).isEqualTo(1);
return this.eiTypes.getType(eiTypeId);
}