From d91665992b329d5fd15777169ff8db2dd82ad1a5 Mon Sep 17 00:00:00 2001 From: Eduardo Santos Date: Wed, 15 Jan 2025 11:30:36 +0000 Subject: [PATCH 1/6] Fixed LCM escape method --- .../etsi/osl/osom/lcm/LcmBaseExecutor.java | 36 ++++++++--- .../etsi/osl/osom/LcmBaseExecutorTest.java | 62 +++++++++++++++++++ 2 files changed, 90 insertions(+), 8 deletions(-) create mode 100644 src/test/java/org/etsi/osl/osom/LcmBaseExecutorTest.java diff --git a/src/main/java/org/etsi/osl/osom/lcm/LcmBaseExecutor.java b/src/main/java/org/etsi/osl/osom/lcm/LcmBaseExecutor.java index 7e7025a..741676d 100644 --- a/src/main/java/org/etsi/osl/osom/lcm/LcmBaseExecutor.java +++ b/src/main/java/org/etsi/osl/osom/lcm/LcmBaseExecutor.java @@ -1,6 +1,9 @@ package org.etsi.osl.osom.lcm; +import java.io.File; import java.io.IOException; +import java.time.LocalDate; +import java.time.LocalTime; import java.time.OffsetDateTime; import java.time.ZoneOffset; import java.util.ArrayList; @@ -11,15 +14,20 @@ import java.util.function.Consumer; import javax.net.ssl.SSLException; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.exc.StreamWriteException; import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; +import com.fasterxml.jackson.databind.DatabindException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectWriter; import com.fasterxml.jackson.databind.node.ArrayNode; import com.jayway.jsonpath.Configuration; import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.Option; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.commons.text.StringEscapeUtils; import org.etsi.osl.osom.partnerservices.GenericClient; import org.etsi.osl.tmf.common.model.Any; import org.etsi.osl.tmf.common.model.EValueType; @@ -126,7 +134,7 @@ public abstract class LcmBaseExecutor { } - private Optional getCharacteristicByName(String charName) { + protected Optional getCharacteristicByName(String charName) { List serviceCharacteristic; if (lcmspec.getLcmrulephase().equals("PRE_PROVISION") || this.vars.getService() == null) { @@ -225,19 +233,31 @@ public abstract class LcmBaseExecutor { return -1; } + public String getCharValAsString(String charName) { - logger.debug("getCharValAsString " + charName); - Optional c = getCharacteristicByName(charName); + Optional characteristic = getCharacteristicByName(charName); - if (c.isPresent()) { - logger.debug("getCharValAsString " + c.get().getValue().getValue()); - return c.get().getValue().getValue(); + logger.info("Getting characteristic value as a string..."); + + if (characteristic.isPresent()) { + return characteristic.get().getValue().getValue(); } - - logger.debug("getCharValAsString NULL "); + return null; + } + + public String escapeText(String s) { + if (s == null || s.isEmpty()) { + logger.debug("escapeText NULL "); + return null; + } + + logger.info("Escaping string..."); + + return "\"" + StringEscapeUtils.escapeJava(s) + "\""; } + public Boolean getCharValFromBooleanType(String charName) { logger.debug("getCharValFromBooleanType " + charName); diff --git a/src/test/java/org/etsi/osl/osom/LcmBaseExecutorTest.java b/src/test/java/org/etsi/osl/osom/LcmBaseExecutorTest.java new file mode 100644 index 0000000..1f02c9a --- /dev/null +++ b/src/test/java/org/etsi/osl/osom/LcmBaseExecutorTest.java @@ -0,0 +1,62 @@ +package org.etsi.osl.osom; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; + +import java.util.Optional; + +import org.etsi.osl.tmf.common.model.Any; +import org.etsi.osl.tmf.common.model.service.Characteristic; +import org.etsi.osl.osom.LcmBaseExecutorTest.TestLcmBaseExecutor; +import org.etsi.osl.osom.lcm.LcmBaseExecutor; +import org.junit.Before; +import org.junit.Test; + +public class LcmBaseExecutorTest { + + private LcmBaseExecutor executor; + + @Before + public void setUp() { + executor = spy(new TestLcmBaseExecutor()); + } + + @Test + public void testGetCharValAsString() { + // Test the method + String result = executor.getCharValAsString("Parameter"); + String expected = "[{\"device\": {\"ipv4Address\": {}, \"networkAccessIdentifier\": \"123456789@domain.com\", \"phoneNumber\": \"+123456789\"}, \"provisioningId\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"qosProfile\": \"QOS_A\", \"status\": \"AVAILABLE\", \"startedAt\": \"2024-12-12T09:52:26Z\"}]"; + assertEquals(expected, result); + } + + @Test + public void testEscapeText() { + String input = "[{\"device\": {\"ipv4Address\": {}, \"networkAccessIdentifier\": \"123456789@domain.com\", \"phoneNumber\": \"+123456789\"}, \"provisioningId\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"qosProfile\": \"QOS_A\", \"status\": \"AVAILABLE\", \"startedAt\": \"2024-12-12T09:52:26Z\"}]"; + String expected = "\"" + input.replace("\"", "\\\"") + "\""; + String result = executor.escapeText(input); + + assertEquals(expected, result); + } + + static class TestLcmBaseExecutor extends LcmBaseExecutor { + @Override + public void exec() { + } + + @Override + protected Optional getCharacteristicByName(String charName) { + Any anyValue = new Any(); + anyValue.setValue( + "[{\"device\": {\"ipv4Address\": {}, \"networkAccessIdentifier\": \"123456789@domain.com\", \"phoneNumber\": \"+123456789\"}, \"provisioningId\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"qosProfile\": \"QOS_A\", \"status\": \"AVAILABLE\", \"startedAt\": \"2024-12-12T09:52:26Z\"}]" + ); + + Characteristic characteristic = new Characteristic(); + characteristic.setName("Parameter"); + characteristic.setValue(anyValue); + + return Optional.of(characteristic); + } + } + +} -- GitLab From 7c873b5432f10640207459ab8d608af640659a14 Mon Sep 17 00:00:00 2001 From: trantzas Date: Tue, 28 Jan 2025 14:10:14 +0000 Subject: [PATCH 2/6] Preparing for Release 2025Q2 --- Dockerfile | 6 +++--- pom.xml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 4709a01..f58352e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ FROM ibm-semeru-runtimes:open-17.0.7_7-jdk MAINTAINER openslice.io RUN mkdir /opt/shareclasses RUN mkdir -p /opt/openslice/lib/ -COPY target/org.etsi.osl.osom-1.1.0.jar /opt/openslice/lib/ -COPY target/org.etsi.osl.osom-1.1.0-exec.jar /opt/openslice/lib/ +COPY target/org.etsi.osl.osom-1.2.0-SNAPSHOT.jar /opt/openslice/lib/ +COPY target/org.etsi.osl.osom-1.2.0-SNAPSHOT-exec.jar /opt/openslice/lib/ COPY . /opt/openslice/lib/ -CMD ["java", "-Xshareclasses:cacheDir=/opt/shareclasses","-jar", "/opt/openslice/lib/org.etsi.osl.osom-1.1.0-exec.jar"] \ No newline at end of file +CMD ["java", "-Xshareclasses:cacheDir=/opt/shareclasses","-jar", "/opt/openslice/lib/org.etsi.osl.osom-1.2.0-SNAPSHOT-exec.jar"] \ No newline at end of file diff --git a/pom.xml b/pom.xml index ead5841..72ab845 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.etsi.osl org.etsi.osl.main - 2024Q4 + 2025Q2-SNAPSHOT ../org.etsi.osl.main -- GitLab From 14eb039dad093754c40ed5a86dd62c6350cc7d89 Mon Sep 17 00:00:00 2001 From: Kostis Trantzas Date: Mon, 12 May 2025 14:47:21 +0300 Subject: [PATCH 3/6] Replace invalid characters in ServiceActionProcess.bpmn (fix for #32) --- src/main/resources/processes/ServiceActionProcess.bpmn | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/processes/ServiceActionProcess.bpmn b/src/main/resources/processes/ServiceActionProcess.bpmn index ef94cc7..5da9421 100644 --- a/src/main/resources/processes/ServiceActionProcess.bpmn +++ b/src/main/resources/processes/ServiceActionProcess.bpmn @@ -44,11 +44,11 @@ - - + + - + @@ -98,7 +98,7 @@ - + -- GitLab From 0a129d810c6bf5da89a279133389edc7ae25008c Mon Sep 17 00:00:00 2001 From: George Tziavas Date: Thu, 12 Jun 2025 15:41:18 +0000 Subject: [PATCH 4/6] Resolve "Initialize the Execution State of a Measurement Collection Job during its creation" --- .gitignore | 1 + .../MetricoOrchestrationService.java | 12 +++++- .../osom/management/ServiceOrderManager.java | 37 +++++++++++++++++++ src/main/resources/application.yml | 3 +- 4 files changed, 50 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 5601d3b..8e0205a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .project .classpath /.settings +/.bpmn \ No newline at end of file diff --git a/src/main/java/org/etsi/osl/osom/management/MetricoOrchestrationService.java b/src/main/java/org/etsi/osl/osom/management/MetricoOrchestrationService.java index d2ee32a..5d938d7 100644 --- a/src/main/java/org/etsi/osl/osom/management/MetricoOrchestrationService.java +++ b/src/main/java/org/etsi/osl/osom/management/MetricoOrchestrationService.java @@ -161,7 +161,7 @@ public class MetricoOrchestrationService implements JavaDelegate { su = new ServiceUpdate();// the object to update the service MeasurementCollectionJob mcj = serviceOrderManager.addMeasurementCollectionJob(mcjFVO); if (mcj != null){ - logger.info("Measurement Collection Job was not created."); + logger.info("Measurement Collection Job was created."); serviceCharacteristic = new Characteristic(); serviceCharacteristic.setName( "_MT_MCJ_REFID" ); @@ -171,7 +171,15 @@ public class MetricoOrchestrationService implements JavaDelegate { val.setAlias( "" ); serviceCharacteristic.setValue(val); su.addServiceCharacteristicItem(serviceCharacteristic); - + + MeasurementCollectionJobMVO mcjMVO = new MeasurementCollectionJobMVO(); + mcjMVO.setExecutionState(ExecutionStateType.ACKNOWLEDGED); + try { + serviceOrderManager.updateMeasurementCollectionJobById(mcj.getUuid(), mcjMVO); + } catch (IOException e) { + throw new RuntimeException(e); + } + } else { logger.error("Measurement Collection Job was not created."); su.setState(ServiceStateType.TERMINATED); diff --git a/src/main/java/org/etsi/osl/osom/management/ServiceOrderManager.java b/src/main/java/org/etsi/osl/osom/management/ServiceOrderManager.java index 54bc509..55c4dc0 100644 --- a/src/main/java/org/etsi/osl/osom/management/ServiceOrderManager.java +++ b/src/main/java/org/etsi/osl/osom/management/ServiceOrderManager.java @@ -37,6 +37,7 @@ import org.etsi.osl.model.nfv.ScaleDescriptor; import org.etsi.osl.osom.serviceactions.NSActionRequestPayload; import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob; import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJobFVO; +import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJobMVO; import org.etsi.osl.tmf.pm632.model.Organization; import org.etsi.osl.tmf.rcm634.model.LogicalResourceSpecification; import org.etsi.osl.tmf.rcm634.model.ResourceSpecification; @@ -200,6 +201,9 @@ public class ServiceOrderManager { @Value("${PM_MEASUREMENT_COLLECTION_JOB_ADD}") private String PM_MEASUREMENT_COLLECTION_JOB_ADD = ""; + @Value("${PM_MEASUREMENT_COLLECTION_JOB_UPDATE}") + private String PM_MEASUREMENT_COLLECTION_JOB_UPDATE; + @Transactional public void processOrder(ServiceOrder serviceOrder) { @@ -1167,6 +1171,39 @@ public class ServiceOrderManager { return null; } + /** + * Updates a Measurement Collection Job in the database using the given Measurement Collection Job ID and update information. + * + * @param mcjId the ID of the Measurement Collection Job to update + * @param mcjMVO the update information for the Measurement Collection Job + * @return the updated Measurement Collection Job, or null if the job could not be updated + */ + public MeasurementCollectionJob updateMeasurementCollectionJobById(String mcjId, MeasurementCollectionJobMVO mcjMVO) throws IOException { + + MeasurementCollectionJob measurementCollectionJob; + logger.debug("will update MeasurementCollectionJob with id "+ mcjId+" and \nMeasurementCollectionJob.toString():\n"+ toJsonString(mcjMVO)); + + + try { + Map map = new HashMap<>(); + map.put("mcjid", mcjId); + + Object response = template.requestBodyAndHeaders(PM_MEASUREMENT_COLLECTION_JOB_UPDATE, toJsonString(mcjMVO), map); + logger.info("JsonUtil.toJsonString(mcjMVO): \n" + toJsonString(mcjMVO)); + if (!(response instanceof String)) { + logger.error("MeasurementCollectionJob object is wrong."); + return null; + } + measurementCollectionJob = toJsonObj((String) response, MeasurementCollectionJob.class); + logger.info("response from PM_MEASUREMENT_COLLECTION_JOB_UPDATE: " + response); + return measurementCollectionJob; + } catch (Exception e) { + e.printStackTrace(); + logger.error("Cannot update MeasurementCollectionJob with id " + mcjId + ":\n" + e.toString()); + } + return null; + } + diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 55f42c5..baeda01 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -127,4 +127,5 @@ CRD_DELETE_CR_REQ: "jms:queue:CRD.DELETE.CR_REQ" CRD_PATCH_CR_REQ: "jms:queue:CRD.PATCH.CR_REQ" #TMF628 ACTIONS -PM_MEASUREMENT_COLLECTION_JOB_ADD: "jms:queue:PM.MEASUREMENTCOLLECTIONJOB.ADD" \ No newline at end of file +PM_MEASUREMENT_COLLECTION_JOB_ADD: "jms:queue:PM.MEASUREMENTCOLLECTIONJOB.ADD" +PM_MEASUREMENT_COLLECTION_JOB_UPDATE: "jms:queue:PM.MEASUREMENTCOLLECTIONJOB.UPDATE" \ No newline at end of file -- GitLab From d1c492efaefa80da7b643aa7335362586691f995 Mon Sep 17 00:00:00 2001 From: George Tziavas Date: Tue, 24 Jun 2025 07:14:58 +0000 Subject: [PATCH 5/6] Resolve "METRICO will use Service Order's START and END time" --- .../MetricoOrchestrationService.java | 25 ++++++------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/etsi/osl/osom/management/MetricoOrchestrationService.java b/src/main/java/org/etsi/osl/osom/management/MetricoOrchestrationService.java index 5d938d7..faf1c9f 100644 --- a/src/main/java/org/etsi/osl/osom/management/MetricoOrchestrationService.java +++ b/src/main/java/org/etsi/osl/osom/management/MetricoOrchestrationService.java @@ -81,25 +81,16 @@ public class MetricoOrchestrationService implements JavaDelegate { String cfs_id = String.valueOf(serviceCharacteristic.getValue().getValue()); mcjFVO.setConsumingApplicationId(cfs_id); - serviceCharacteristic = aService.getServiceCharacteristicByName("_MT_END_TIME"); - String endTimeString = String.valueOf(serviceCharacteristic.getValue().getValue()); ScheduleDefinitionFVO scheduleDefinition = new ScheduleDefinitionFVO(); - if (endTimeString != null && !endTimeString.equals("")) { - OffsetDateTime endTime = convertStringToOffsetDateTime(endTimeString, DateTimeFormat.ISO.DATE_TIME ); - scheduleDefinition.setScheduleDefinitionEndTime(endTime); - } else{ - OffsetDateTime endTime = OffsetDateTime.now().plusHours(1); - scheduleDefinition.setScheduleDefinitionEndTime(endTime); + if(aService.getStartDate() != null) { + scheduleDefinition.setScheduleDefinitionStartTime(aService.getStartDate()); + } else { + scheduleDefinition.setScheduleDefinitionStartTime(OffsetDateTime.now(ZoneOffset.UTC)); } - - serviceCharacteristic = aService.getServiceCharacteristicByName("_MT_START_TIME"); - String startTimeString = String.valueOf(serviceCharacteristic.getValue().getValue()); - if (startTimeString != null&& !startTimeString.equals("")) { - OffsetDateTime startTime = convertStringToOffsetDateTime(startTimeString, DateTimeFormat.ISO.DATE_TIME ); - scheduleDefinition.setScheduleDefinitionStartTime(startTime); - } else{ - OffsetDateTime startTime = OffsetDateTime.now(); - scheduleDefinition.setScheduleDefinitionStartTime(startTime); + if(aService.getEndDate() != null) { + scheduleDefinition.setScheduleDefinitionEndTime(aService.getEndDate()); + } else { + scheduleDefinition.setScheduleDefinitionEndTime(OffsetDateTime.now(ZoneOffset.UTC).plusHours(1)); } List scheduleDefinitions = new ArrayList<>(); scheduleDefinitions.add(scheduleDefinition); -- GitLab From 3ff113f411c09fadc2eccb2b64f087de8be99467 Mon Sep 17 00:00:00 2001 From: trantzas Date: Fri, 18 Jul 2025 11:29:26 +0000 Subject: [PATCH 6/6] Preparing for the Release 2025Q2 --- Dockerfile | 6 +++--- pom.xml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index f58352e..c008033 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ FROM ibm-semeru-runtimes:open-17.0.7_7-jdk MAINTAINER openslice.io RUN mkdir /opt/shareclasses RUN mkdir -p /opt/openslice/lib/ -COPY target/org.etsi.osl.osom-1.2.0-SNAPSHOT.jar /opt/openslice/lib/ -COPY target/org.etsi.osl.osom-1.2.0-SNAPSHOT-exec.jar /opt/openslice/lib/ +COPY target/org.etsi.osl.osom-1.2.0.jar /opt/openslice/lib/ +COPY target/org.etsi.osl.osom-1.2.0-exec.jar /opt/openslice/lib/ COPY . /opt/openslice/lib/ -CMD ["java", "-Xshareclasses:cacheDir=/opt/shareclasses","-jar", "/opt/openslice/lib/org.etsi.osl.osom-1.2.0-SNAPSHOT-exec.jar"] \ No newline at end of file +CMD ["java", "-Xshareclasses:cacheDir=/opt/shareclasses","-jar", "/opt/openslice/lib/org.etsi.osl.osom-1.2.0-exec.jar"] \ No newline at end of file diff --git a/pom.xml b/pom.xml index 72ab845..441a138 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.etsi.osl org.etsi.osl.main - 2025Q2-SNAPSHOT + 2025Q2 ../org.etsi.osl.main -- GitLab