diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8ea78d6c6187dd518ec9fb389aae2a666ba82c86..bb7d754baa751630b25598e182a30f062e9b6ebd 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -15,13 +15,21 @@ include: rules: - if: '$CI_COMMIT_REF_NAME == "develop"' + - project: osl/code/org.etsi.osl.main + ref: $CI_COMMIT_REF_NAME + file: + - ci-templates/default.yml + - ci-templates/build.yml + rules: + - if: '$CI_COMMIT_REF_PROTECTED && $CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "develop"' + - project: osl/code/org.etsi.osl.main ref: develop file: - ci-templates/default.yml - ci-templates/build_unprotected.yml rules: - - if: '$CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "develop"' + - if: '$CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "develop" && !$CI_COMMIT_REF_PROTECTED' maven_build: extends: .maven_build diff --git a/Dockerfile b/Dockerfile index c5f39895bf71ba4fbc8c0b17d711383ccb024b30..e7a7b05cf8fe304860bd076a7163a384075171d4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM ibm-semeru-runtimes:open-17.0.7_7-jdk # RUN mkdir /opt/shareclasses RUN mkdir -p /opt/openslice/lib/ -COPY target/org.etsi.osl.tmf.api-1.0.0-SNAPSHOT-exec.jar /opt/openslice/lib/ -CMD ["java", "-Xshareclasses:cacheDir=/opt/shareclasses", "-jar", "/opt/openslice/lib/org.etsi.osl.tmf.api-1.0.0-SNAPSHOT-exec.jar"] +COPY target/org.etsi.osl.tmf.api-1.0.0-exec.jar /opt/openslice/lib/ +CMD ["java", "-Xshareclasses:cacheDir=/opt/shareclasses", "-jar", "/opt/openslice/lib/org.etsi.osl.tmf.api-1.0.0-exec.jar"] EXPOSE 13082 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 58e5ef27ab88eaaeab02fd46166835d201ee6b48..885c3062d39c252078cdaf8636c69305ec312f2a 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.etsi.osl</groupId> <artifactId>org.etsi.osl.main</artifactId> - <version>1.0.0-SNAPSHOT</version> + <version>1.0.0</version> <relativePath>../org.etsi.osl.main</relativePath> </parent> diff --git a/src/main/java/org/etsi/osl/tmf/scm633/reposervices/ServiceSpecificationRepoService.java b/src/main/java/org/etsi/osl/tmf/scm633/reposervices/ServiceSpecificationRepoService.java index 99dcaf3c830ebc72530df9e7fb5e3c3a50aea3a3..f2a517266d56a3334fbf812e3806a5a4ede9b5ed 100644 --- a/src/main/java/org/etsi/osl/tmf/scm633/reposervices/ServiceSpecificationRepoService.java +++ b/src/main/java/org/etsi/osl/tmf/scm633/reposervices/ServiceSpecificationRepoService.java @@ -1144,7 +1144,7 @@ public class ServiceSpecificationRepoService { return null; } - logger.error("nsdid returned: " + nsd.getName()); + logger.debug("nsdid returned: " + nsd.getName()); List<ServiceSpecification> newRfservices = new ArrayList<>(); diff --git a/src/main/java/org/etsi/osl/tmf/sim638/api/ServiceApiRouteBuilder.java b/src/main/java/org/etsi/osl/tmf/sim638/api/ServiceApiRouteBuilder.java index 55e38b6687ada1511b065fadd1fb68c4d99f290c..93afc976d554ffe86976320a3e0d56fd7b591191 100644 --- a/src/main/java/org/etsi/osl/tmf/sim638/api/ServiceApiRouteBuilder.java +++ b/src/main/java/org/etsi/osl/tmf/sim638/api/ServiceApiRouteBuilder.java @@ -20,12 +20,15 @@ package org.etsi.osl.tmf.sim638.api; import java.io.IOException; - +import java.util.Date; +import java.util.Map; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; - +import org.apache.camel.Exchange; import org.apache.camel.LoggingLevel; +import org.apache.camel.Processor; import org.apache.camel.ProducerTemplate; +import org.apache.camel.RuntimeCamelException; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.model.dataformat.JsonLibrary; import org.apache.commons.logging.Log; @@ -44,6 +47,11 @@ import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; import org.etsi.osl.model.nfv.DeploymentDescriptor; +import org.etsi.osl.model.nfv.ExperimentMetadata; +import org.etsi.osl.model.nfv.Product; +import org.etsi.osl.model.nfv.ValidationJob; +import org.etsi.osl.model.nfv.ValidationStatus; +import org.etsi.osl.model.nfv.VxFMetadata; @Configuration //@RefreshScope @@ -111,6 +119,9 @@ public class ServiceApiRouteBuilder extends RouteBuilder { @Override public void configure() throws Exception { + + + from( CATALOG_ADD_SERVICE ) .log(LoggingLevel.INFO, log, CATALOG_ADD_SERVICE + " message received and will be processed for service inventory!") .to("log:DEBUG?showBody=true&showHeaders=true") @@ -188,8 +199,7 @@ public class ServiceApiRouteBuilder extends RouteBuilder { .unmarshal().json( JsonLibrary.Jackson, DeploymentDescriptor.class, true) .bean( serviceRepoService, "nfvCatalogNSResourceChanged(${body})"); - - + from( EVENT_RESOURCE_STATE_CHANGED ) .log(LoggingLevel.INFO, log, EVENT_RESOURCE_STATE_CHANGED + " message received and will be processed for service inventory!") @@ -199,6 +209,13 @@ public class ServiceApiRouteBuilder extends RouteBuilder { from( EVENT_RESOURCE_CREATE ) + .errorHandler(deadLetterChannel("direct:retriesDeadLetters") + .maximumRedeliveries(5) + .redeliveryDelay(1000).useOriginalMessage() + .logExhausted(true) + .logHandled(true) + .retriesExhaustedLogLevel(LoggingLevel.ERROR) + .retryAttemptedLogLevel(LoggingLevel.ERROR)) .log(LoggingLevel.INFO, log, EVENT_RESOURCE_CREATE + " message received and will be processed for service inventory!") .to("log:DEBUG?showBody=true&showHeaders=true") .unmarshal().json( JsonLibrary.Jackson, ResourceCreateNotification.class, true) @@ -208,15 +225,33 @@ public class ServiceApiRouteBuilder extends RouteBuilder { from( EVENT_RESOURCE_ATTRIBUTE_VALUE_CHANGED ) + .errorHandler(deadLetterChannel("direct:retriesDeadLetters") + .maximumRedeliveries(5) + .redeliveryDelay(1000).useOriginalMessage() + .logExhausted(true) + .logHandled(true) + .retriesExhaustedLogLevel(LoggingLevel.ERROR) + .retryAttemptedLogLevel(LoggingLevel.ERROR)) + .log(LoggingLevel.INFO, log, EVENT_RESOURCE_ATTRIBUTE_VALUE_CHANGED + " message received and will be processed for service inventory!") .to("log:DEBUG?showBody=true&showHeaders=true") .unmarshal().json( JsonLibrary.Jackson, ResourceAttributeValueChangeNotification.class, true) .bean( serviceRepoService, "resourceAttrChangedEvent(${body})"); + + /** + * dead Letter Queue msgs if everything fails to connect + */ + from("direct:retriesDeadLetters") + //.setBody() + //.body(String.class) + //.process( ErroneousValidationProcessor ) + .to("log:DEBUG?showBody=true&showHeaders=true") + .to("stream:out"); } - + static String toJsonString(Object object) throws IOException { ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); diff --git a/src/main/java/org/etsi/osl/tmf/sim638/service/ServiceRepoService.java b/src/main/java/org/etsi/osl/tmf/sim638/service/ServiceRepoService.java index d38b8ad4523385261576bd1e06fdc3c03025d4bb..eaf0609a083947ceee28114efacb3f886ee9b9f2 100644 --- a/src/main/java/org/etsi/osl/tmf/sim638/service/ServiceRepoService.java +++ b/src/main/java/org/etsi/osl/tmf/sim638/service/ServiceRepoService.java @@ -818,6 +818,7 @@ public class ServiceRepoService { // this.updateService( parentServiceId, servUpd, false, null, childService); // } + @Transactional public String getServiceEagerAsString(String id) throws JsonProcessingException { Service s = this.getServiceEager(id); ObjectMapper mapper = new ObjectMapper(); @@ -837,7 +838,8 @@ public class ServiceRepoService { return res; } - + + @Transactional public Service getServiceEager(String id) { if ( id == null || id.equals("")) { return null; @@ -904,6 +906,7 @@ public class ServiceRepoService { /** * @return */ + @Transactional public List<ServiceActionQueueItem> findAllServiceActionQueueItems() { return (List<ServiceActionQueueItem>) this.serviceActionQueueRepo.findFirst10ByOrderByInsertedDate(); @@ -934,6 +937,7 @@ public class ServiceRepoService { * @param id * @return */ + @Transactional public Void deleteServiceActionQueueItemByUuid(String id) { Optional<ServiceActionQueueItem> optso = this.serviceActionQueueRepo.findByUuid(id); @@ -1077,40 +1081,46 @@ public class ServiceRepoService { @Transactional public void resourceAttrChangedEvent(@Valid ResourceAttributeValueChangeNotification resNotif) { + try { + + logger.debug("ResourceAttributeValueChangeNotification"); + Resource res = resNotif.getEvent().getEvent().getResource(); + logger.info("Will update services related to this resource with id = " + res.getId() ); + + var aservices = findServicesHavingThisSupportingResourceID( res.getId() ); + + for (Service as : aservices) { + + Service aService = findByUuid(as.getId()); + + //if ( aService.getState().equals( ServiceStateType.ACTIVE ) ) { + + + ServiceUpdate supd = new ServiceUpdate(); + + //copy characteristics from resource to service + + for (org.etsi.osl.tmf.ri639.model.Characteristic rChar : res.getResourceCharacteristic()) { + Characteristic cNew = new Characteristic(); + cNew.setName( rChar.getName()); + cNew.value( new Any( rChar.getValue() )); + supd.addServiceCharacteristicItem( cNew ); + } + + + Note n = new Note(); + n.setText("Supporting Resource Attribute Changed with id: " + res.getId()); + n.setAuthor( "SIM638-API" ); + n.setDate( OffsetDateTime.now(ZoneOffset.UTC).toString() ); + supd.addNoteItem( n ); + + this.updateService( aService.getId(), supd , true, null, null); //update the service + //} + } - logger.debug("ResourceAttributeValueChangeNotification"); - Resource res = resNotif.getEvent().getEvent().getResource(); - logger.info("Will update services related to this resource with id = " + res.getId() ); - - var aservices = findServicesHavingThisSupportingResourceID( res.getId() ); - - for (Service as : aservices) { - - Service aService = findByUuid(as.getId()); - - //if ( aService.getState().equals( ServiceStateType.ACTIVE ) ) { - - ServiceUpdate supd = new ServiceUpdate(); - - //copy characteristics from resource to service - - for (org.etsi.osl.tmf.ri639.model.Characteristic rChar : res.getResourceCharacteristic()) { - Characteristic cNew = new Characteristic(); - cNew.setName( rChar.getName()); - cNew.value( new Any( rChar.getValue() )); - supd.addServiceCharacteristicItem( cNew ); - } - - - Note n = new Note(); - n.setText("Supporting Resource Attribute Changed with id: " + res.getId()); - n.setAuthor( "SIM638-API" ); - n.setDate( OffsetDateTime.now(ZoneOffset.UTC).toString() ); - supd.addNoteItem( n ); - - this.updateService( aService.getId(), supd , true, null, null); //update the service - //} + }catch (Exception e) { + e.printStackTrace(); } } @@ -1118,20 +1128,32 @@ public class ServiceRepoService { @Transactional public void resourceCreatedEvent(@Valid ResourceCreateNotification resNotif) { - Resource res = resNotif.getEvent().getEvent().getResource(); - logger.debug("resourceCreatedEvent for: " + res.getName()); - updateServiceFromresourceChange(res); + try { + Resource res = resNotif.getEvent().getEvent().getResource(); + logger.debug("resourceCreatedEvent for: " + res.getName()); + updateServiceFromresourceChange(res); + }catch (Exception e) { + e.printStackTrace(); + } + } @Transactional public void resourceStateChangedEvent(@Valid ResourceStateChangeNotification resNotif) { + try { + + Resource res = resNotif.getEvent().getEvent().getResource(); + logger.debug("resourceStateChangedEvent for: " + res.getName()); + updateServiceFromresourceChange(res); - Resource res = resNotif.getEvent().getEvent().getResource(); - logger.debug("resourceStateChangedEvent for: " + res.getName()); - updateServiceFromresourceChange(res); + }catch (Exception e) { + e.printStackTrace(); + } + } - + + @Transactional private void updateServiceFromresourceChange(Resource res) { logger.info("Will update services related to this resource with id = " + res.getId() ); @@ -1172,6 +1194,7 @@ public class ServiceRepoService { } + @Transactional private void updateResourceFromKubernetesLabel(Resource res) { logger.debug("updateResourceFromKubernetesLabel for: " + res.getName()); diff --git a/src/main/java/org/etsi/osl/tmf/util/PrimitivesParser.java b/src/main/java/org/etsi/osl/tmf/util/PrimitivesParser.java index 64557ad5e9fdda97daa56ba449b5232ee0e21740..ca5a5da3e4c0772800eb817a203c5f1ea0765d81 100644 --- a/src/main/java/org/etsi/osl/tmf/util/PrimitivesParser.java +++ b/src/main/java/org/etsi/osl/tmf/util/PrimitivesParser.java @@ -34,6 +34,7 @@ import org.yaml.snakeyaml.Yaml; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File; +import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -107,10 +108,20 @@ public class PrimitivesParser { public static JSONObject processNSD(NetworkServiceDescriptor nsd) { // Parse the NSD descriptor from string to YAML Yaml yaml = new Yaml(); - Map<String, Object> yamlMap = yaml.load(nsd.getDescriptor()); - - // Parse the NSD descriptor from YAML to JSONObject - JSONObject nsdJson = new JSONObject(yamlMap); + JSONObject nsdJson; + + Object obj = yaml.load(nsd.getDescriptor()); + + if ( obj instanceof ArrayList) { + // Parse the NSD descriptor from YAML to JSONObject + nsdJson = new JSONObject( (ArrayList<Object>)obj ); + + }else { + Map<String, Object> yamlMap = ( Map<String, Object> ) obj; + // Parse the NSD descriptor from YAML to JSONObject + nsdJson = new JSONObject(yamlMap); + } + return nsdJson; } @@ -135,7 +146,10 @@ public class PrimitivesParser { if (descriptor.trim().startsWith("[")) { // It's JSON vnfdJson = new JSONObject(descriptor.substring(1, descriptor.length() - 1)); - } else { + } else if (descriptor.trim().startsWith("{")) { + // It's JSON + vnfdJson = new JSONObject(descriptor); + } else{ // It's YAML Yaml yaml = new Yaml(); Map<String, Object> yamlMap = yaml.load(descriptor); @@ -164,8 +178,14 @@ public class PrimitivesParser { // Attach the empty array to the JSONObject under the key "vnfs" vnfs.put("vnfs", vnfsArray); - - JSONArray nsdArray = nsdJson.getJSONObject("nsd").getJSONArray("nsd"); + JSONArray nsdArray = null; + if ( nsdJson.has("nsd") ) { + nsdArray = nsdJson.getJSONObject("nsd").getJSONArray("nsd"); + } else { + nsdArray = new JSONArray(); + nsdArray.put(nsdJson); + } + // Assuming that there might be multiple 'nsd' entries, iterate over them processNSDEntries(nsdArray, vnfsArray);