From f44cd2add6be2594e4a103ae8b4eea799631d5d1 Mon Sep 17 00:00:00 2001 From: George Tziavas Date: Tue, 24 Jun 2025 19:33:08 +0300 Subject: [PATCH 1/7] handling service attr change event --- .../osl/metrico/MetricoCommonMethods.java | 5 + .../osl/metrico/services/MetricoService.java | 92 ++++++++++++++++++- .../services/MetricoServiceRouteBuilder.java | 10 ++ src/main/resources/application.yml | 3 +- 4 files changed, 106 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/etsi/osl/metrico/MetricoCommonMethods.java b/src/main/java/org/etsi/osl/metrico/MetricoCommonMethods.java index 0664b5a..acfc378 100644 --- a/src/main/java/org/etsi/osl/metrico/MetricoCommonMethods.java +++ b/src/main/java/org/etsi/osl/metrico/MetricoCommonMethods.java @@ -383,4 +383,9 @@ public class MetricoCommonMethods extends RouteBuilder { } return null; } + + public boolean notNullOrEmpty(String str) { + return str != null && !str.isEmpty(); + } + } diff --git a/src/main/java/org/etsi/osl/metrico/services/MetricoService.java b/src/main/java/org/etsi/osl/metrico/services/MetricoService.java index a82a3ab..43dd051 100644 --- a/src/main/java/org/etsi/osl/metrico/services/MetricoService.java +++ b/src/main/java/org/etsi/osl/metrico/services/MetricoService.java @@ -10,6 +10,7 @@ import org.etsi.osl.metrico.prometheus.PrometheusQueries; import org.etsi.osl.tmf.common.model.ELifecycle; import org.etsi.osl.tmf.common.model.EValueType; import org.etsi.osl.tmf.common.model.Notification; +import org.etsi.osl.tmf.common.model.service.Characteristic; import org.etsi.osl.tmf.common.model.service.ServiceStateType; import org.etsi.osl.tmf.pm628.model.*; import org.etsi.osl.tmf.rcm634.model.LogicalResourceSpecification; @@ -17,6 +18,7 @@ import org.etsi.osl.tmf.rcm634.model.ResourceSpecification; import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationCreate; import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationRef; import org.etsi.osl.tmf.scm633.model.ServiceSpecification; +import org.etsi.osl.tmf.sim638.model.ServiceAttributeValueChangeNotification; import org.etsi.osl.tmf.sim638.model.ServiceDeleteNotification; import org.etsi.osl.tmf.sim638.model.ServiceStateChangeNotification; import org.slf4j.Logger; @@ -26,6 +28,8 @@ import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; +import java.net.URI; +import java.net.URISyntaxException; import java.time.OffsetDateTime; import java.util.List; @@ -217,6 +221,8 @@ public class MetricoService extends RouteBuilder { service = ((ServiceStateChangeNotification) n).getEvent().getService(); } else if (n instanceof ServiceDeleteNotification){ service = ((ServiceDeleteNotification) n).getEvent().getService(); + } else if (n instanceof ServiceAttributeValueChangeNotification){ + service = ((ServiceAttributeValueChangeNotification) n).getEvent().getService(); } ServiceSpecification serviceSpec = null; @@ -227,19 +233,99 @@ public class MetricoService extends RouteBuilder { if(serviceSpec != null){ // Check if it is an RFS SPEC if(serviceSpec.getResourceSpecification().size() == 1) { + // Check if it is a METRICO service ResourceSpecificationRef rSpec = serviceSpec.getResourceSpecification().iterator().next(); if (rSpec.getId().equalsIgnoreCase(OSL_METRICO_RSPEC_ID)) { - if (service.getState() == ServiceStateType.TERMINATED) { + if (n instanceof ServiceStateChangeNotification && service.getState() == ServiceStateType.TERMINATED) { logger.debug("Service {} is a METRICO service with state TERMINATED. Terminating related job.", service.getId()); jobService.stopJob(String.valueOf(service.getServiceCharacteristicByName("_MT_MCJ_REFID").getValue().getValue())); } - if (n instanceof ServiceDeleteNotification){ + else if (n instanceof ServiceDeleteNotification){ logger.debug("Service {} is a METRICO service that was deleted. Terminating related job.", service.getId()); jobService.stopJob(String.valueOf(service.getServiceCharacteristicByName("_MT_MCJ_REFID").getValue().getValue())); } + else if (n instanceof ServiceAttributeValueChangeNotification) { + logger.debug("Service {} is a METRICO service with state ACTIVE. Starting related job.", service.getId()); + MeasurementCollectionJobMVO mcjMVO = new MeasurementCollectionJobMVO(); + MeasurementCollectionJob mcjOld = metricoCommonMethods.retrieveMeasurementCollectionJob( + service.getServiceCharacteristicByName("_MT_MCJ_REFID").getValue().getValue() + ); + Characteristic serviceCharacteristic; + + if(!mcjOld.getProducingApplicationId().equals(service.getId())) { + mcjMVO.setProducingApplicationId(service.getServiceSpecificationRef().getId()); + } + serviceCharacteristic = service.getServiceCharacteristicByName("_MT_CHARACTERISTIC_NAME"); + String characteristicName = String.valueOf(serviceCharacteristic.getValue().getValue()); + if (metricoCommonMethods.notNullOrEmpty(characteristicName) && !mcjOld.getOutputFormat().equals(characteristicName)){ + mcjMVO.setOutputFormat(characteristicName); + } + serviceCharacteristic = service.getServiceCharacteristicByName("_MT_SERVICEUUID"); + String cfs_id = String.valueOf(serviceCharacteristic.getValue().getValue()); + if(metricoCommonMethods.notNullOrEmpty(cfs_id) && !mcjOld.getConsumingApplicationId().equals(cfs_id)) { + mcjMVO.setConsumingApplicationId(cfs_id); + } + ScheduleDefinitionMVO scheduleDefinitionNew = new ScheduleDefinitionMVO(); + ScheduleDefinition scheduleDefinitionOld = mcjOld.getScheduleDefinition().get(0); + boolean scheduleDefinitionChanged = false; + if(!scheduleDefinitionOld.getScheduleDefinitionStartTime().equals(service.getStartDate())){ + scheduleDefinitionNew.setScheduleDefinitionStartTime(service.getStartDate()); + scheduleDefinitionChanged = true; + } + if (!scheduleDefinitionOld.getScheduleDefinitionEndTime().equals(service.getEndDate())) { + scheduleDefinitionNew.setScheduleDefinitionEndTime(service.getEndDate()); + scheduleDefinitionChanged = true; + } + if (scheduleDefinitionChanged) { + mcjMVO.addScheduleDefinitionItem(scheduleDefinitionNew); + } + + serviceCharacteristic = service.getServiceCharacteristicByName("_MT_RECURRING_INTERVAL"); + String recurringIntervalString = String.valueOf(serviceCharacteristic.getValue().getValue()); + if(metricoCommonMethods.notNullOrEmpty(recurringIntervalString) && !mcjOld.getGranularity().toString().equalsIgnoreCase(recurringIntervalString)) { + if (Granularity.contains(recurringIntervalString)){ + mcjMVO.setGranularity(Granularity.valueOf(recurringIntervalString)); + } + } + + boolean dataAccessEndpointChanged = false; + DataAccessEndpointMVO daeMVO = new DataAccessEndpointMVO(); + DataAccessEndpoint daeOld = mcjOld.getDataAccessEndpoint().get(0); + serviceCharacteristic = service.getServiceCharacteristicByName("_MT_TYPE"); + String monitoringType = String.valueOf(serviceCharacteristic.getValue().getValue()); + if(metricoCommonMethods.notNullOrEmpty(monitoringType) && !daeOld.getApiType().equalsIgnoreCase(monitoringType)) { + daeMVO.setApiType(monitoringType); + dataAccessEndpointChanged = true; + } + + serviceCharacteristic = service.getServiceCharacteristicByName("_MT_QUERY"); + String monitoringQuery = String.valueOf(serviceCharacteristic.getValue().getValue()); + serviceCharacteristic = service.getServiceCharacteristicByName("_MT_URL"); + String monitoringURL = String.valueOf(serviceCharacteristic.getValue().getValue()); + URI newUri = null; + try { + newUri = new URI(monitoringURL + "?" + monitoringQuery); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + if(!daeOld.getUri().equals(newUri)) { + daeMVO.setUri(newUri); + dataAccessEndpointChanged = true; + } + if(dataAccessEndpointChanged) { + mcjMVO.addDataAccessEndpointItem(daeMVO); + } + + MeasurementCollectionJob updatedMCJ = metricoCommonMethods.updateMeasurementCollectionJobById( + mcjOld.getUuid(), mcjMVO); + jobService.stopJob(String.valueOf(service.getServiceCharacteristicByName("_MT_MCJ_REFID").getValue().getValue())); + startPeriodicQueryToPrometheus(updatedMCJ); + } + else { + logger.debug("Service {} is a METRICO service with state {}. No action taken.", service.getId(), service.getState()); + } } else { logger.debug("Service {} is not a METRICO service, skipping.", service.getId()); - return; } } } diff --git a/src/main/java/org/etsi/osl/metrico/services/MetricoServiceRouteBuilder.java b/src/main/java/org/etsi/osl/metrico/services/MetricoServiceRouteBuilder.java index d9f4f38..f1f0702 100644 --- a/src/main/java/org/etsi/osl/metrico/services/MetricoServiceRouteBuilder.java +++ b/src/main/java/org/etsi/osl/metrico/services/MetricoServiceRouteBuilder.java @@ -6,6 +6,7 @@ import org.apache.camel.model.dataformat.JsonLibrary; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJobCreateEvent; +import org.etsi.osl.tmf.sim638.model.ServiceAttributeValueChangeNotification; import org.etsi.osl.tmf.sim638.model.ServiceDeleteNotification; import org.etsi.osl.tmf.sim638.model.ServiceStateChangeNotification; import org.springframework.beans.factory.annotation.Autowired; @@ -31,6 +32,9 @@ public class MetricoServiceRouteBuilder extends RouteBuilder { @Value("${EVENT_SERVICE_DELETE}") private String EVENT_SERVICE_DELETE = ""; + @Value("${EVENT_SERVICE_ATTRIBUTE_VALUE_CHANGED}}") + private String EVENT_SERVICE_ATTRIBUTE_VALUE_CHANGED = ""; + public void configure() throws Exception { from(EVENT_MEASUREMENT_COLLECTION_JOB_CREATE) @@ -53,6 +57,12 @@ public class MetricoServiceRouteBuilder extends RouteBuilder { .unmarshal() .json(JsonLibrary.Jackson, ServiceDeleteNotification.class, true) .bean(metricoService, "handleServiceEvent"); + from(EVENT_SERVICE_ATTRIBUTE_VALUE_CHANGED) + .log(LoggingLevel.INFO, log, EVENT_SERVICE_ATTRIBUTE_VALUE_CHANGED + " message received!") + .to("log:DEBUG?showBody=true&showHeaders=true") + .unmarshal() + .json(JsonLibrary.Jackson, ServiceAttributeValueChangeNotification.class, true) + .bean(metricoService, "handleServiceEvent"); } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 7bfdb49..3948c4a 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -62,4 +62,5 @@ CATALOG_UPD_RESOURCE: "jms:queue:CATALOG.UPD.RESOURCE" CATALOG_UPD_SERVICE: "jms:queue:CATALOG.UPD.SERVICE" EVENT_SERVICE_STATE_CHANGED: "jms:topic:EVENT.SERVICE.STATECHANGED" -EVENT_SERVICE_DELETE: "jms:topic:EVENT.SERVICE.DELETE" \ No newline at end of file +EVENT_SERVICE_DELETE: "jms:topic:EVENT.SERVICE.DELETE" +EVENT_SERVICE_ATTRIBUTE_VALUE_CHANGED: "jms:topic:EVENT.SERVICE.ATTRCHANGED" \ No newline at end of file -- GitLab From 02f6c03a3b148203376b27cedff062cfc0665692 Mon Sep 17 00:00:00 2001 From: George Tziavas Date: Tue, 24 Jun 2025 19:36:41 +0300 Subject: [PATCH 2/7] remove an import --- src/main/java/org/etsi/osl/metrico/services/MetricoService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/etsi/osl/metrico/services/MetricoService.java b/src/main/java/org/etsi/osl/metrico/services/MetricoService.java index 43dd051..f90737c 100644 --- a/src/main/java/org/etsi/osl/metrico/services/MetricoService.java +++ b/src/main/java/org/etsi/osl/metrico/services/MetricoService.java @@ -14,7 +14,6 @@ import org.etsi.osl.tmf.common.model.service.Characteristic; import org.etsi.osl.tmf.common.model.service.ServiceStateType; import org.etsi.osl.tmf.pm628.model.*; import org.etsi.osl.tmf.rcm634.model.LogicalResourceSpecification; -import org.etsi.osl.tmf.rcm634.model.ResourceSpecification; import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationCreate; import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationRef; import org.etsi.osl.tmf.scm633.model.ServiceSpecification; -- GitLab From 80ab0e88567eaf364b9e13d79b3ce523db58e7bf Mon Sep 17 00:00:00 2001 From: George Tziavas Date: Tue, 24 Jun 2025 19:40:15 +0300 Subject: [PATCH 3/7] optimise imports --- .../mapper/DataAccessEndpointMapper.java | 1 - .../mapper/MeasurementCollectionJobMapper.java | 18 +----------------- .../mapper/ResourceRefOrValueMapper.java | 17 +---------------- .../metrico/prometheus/PrometheusQueries.java | 1 - .../osl/metrico/services/MetricoService.java | 1 - .../org/etsi/osl/metrico/JsonUtilTest.java | 3 --- .../etsi/osl/metrico/mapper/JobMapperTest.java | 5 ++++- .../org/etsi/osl/metrico/model/JobTest.java | 1 - .../osl/metrico/services/JobServiceTest.java | 1 - 9 files changed, 6 insertions(+), 42 deletions(-) diff --git a/src/main/java/org/etsi/osl/metrico/mapper/DataAccessEndpointMapper.java b/src/main/java/org/etsi/osl/metrico/mapper/DataAccessEndpointMapper.java index ec9d152..e2fc0ca 100644 --- a/src/main/java/org/etsi/osl/metrico/mapper/DataAccessEndpointMapper.java +++ b/src/main/java/org/etsi/osl/metrico/mapper/DataAccessEndpointMapper.java @@ -3,7 +3,6 @@ package org.etsi.osl.metrico.mapper; import org.etsi.osl.tmf.pm628.model.DataAccessEndpoint; import org.etsi.osl.tmf.pm628.model.DataAccessEndpointFVO; import org.etsi.osl.tmf.pm628.model.DataAccessEndpointMVO; - import org.mapstruct.*; @Mapper( diff --git a/src/main/java/org/etsi/osl/metrico/mapper/MeasurementCollectionJobMapper.java b/src/main/java/org/etsi/osl/metrico/mapper/MeasurementCollectionJobMapper.java index 639f9ea..acd02b8 100644 --- a/src/main/java/org/etsi/osl/metrico/mapper/MeasurementCollectionJobMapper.java +++ b/src/main/java/org/etsi/osl/metrico/mapper/MeasurementCollectionJobMapper.java @@ -1,22 +1,6 @@ package org.etsi.osl.metrico.mapper; -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.pm628.model.PerformanceIndicatorSpecificationRefOrValueMapper; -import org.etsi.osl.tmf.pm628.model.DataAccessEndpoint; -import org.etsi.osl.tmf.pm628.model.PerformanceIndicatorGroupSpecification; -import org.etsi.osl.tmf.pm628.model.DataAccessEndpointMVO; -import org.etsi.osl.tmf.pm628.model.PerformanceIndicatorGroupSpecificationMVO; -import org.etsi.osl.tmf.pm628.model.PerformanceIndicatorSpecificationRefOrValueMVO; -import org.etsi.osl.tmf.pm628.model.TrackingRecordMVO; -import org.etsi.osl.tmf.pm628.model.PerformanceIndicatorSpecificationRefOrValue; -import org.etsi.osl.tmf.pm628.model.TrackingRecord; -import org.etsi.osl.tmf.pm628.model.ScheduleDefinitionMVO; -import org.etsi.osl.tmf.pm628.model.FileTransferDataMVO; -import org.etsi.osl.tmf.pm628.model.FileTransferData; -import org.etsi.osl.tmf.pm628.model.ScheduleDefinition; - +import org.etsi.osl.tmf.pm628.model.*; import org.mapstruct.*; import java.util.List; diff --git a/src/main/java/org/etsi/osl/metrico/mapper/ResourceRefOrValueMapper.java b/src/main/java/org/etsi/osl/metrico/mapper/ResourceRefOrValueMapper.java index 2c24dd0..3d3ec0f 100644 --- a/src/main/java/org/etsi/osl/metrico/mapper/ResourceRefOrValueMapper.java +++ b/src/main/java/org/etsi/osl/metrico/mapper/ResourceRefOrValueMapper.java @@ -1,21 +1,6 @@ package org.etsi.osl.metrico.mapper; -import org.etsi.osl.tmf.pm628.model.DataAccessEndpoint; -import org.etsi.osl.tmf.pm628.model.DataAccessEndpointFVO; -import org.etsi.osl.tmf.pm628.model.LogicalResource; -import org.etsi.osl.tmf.pm628.model.LogicalResourceFVO; -import org.etsi.osl.tmf.pm628.model.ResourceFVO; -import org.etsi.osl.tmf.pm628.model.Resource; -import org.etsi.osl.tmf.pm628.model.ResourceRefFVO; -import org.etsi.osl.tmf.pm628.model.ResourceRefOrValue; -import org.etsi.osl.tmf.pm628.model.ResourceRef; -import org.etsi.osl.tmf.pm628.model.DataAccessEndpointMVO; -import org.etsi.osl.tmf.pm628.model.LogicalResourceMVO; -import org.etsi.osl.tmf.pm628.model.ResourceMVO; -import org.etsi.osl.tmf.pm628.model.ResourceRefMVO; -import org.etsi.osl.tmf.pm628.model.ResourceRefOrValueFVO; -import org.etsi.osl.tmf.pm628.model.ResourceRefOrValueMVO; - +import org.etsi.osl.tmf.pm628.model.*; import org.mapstruct.*; @Mapper( diff --git a/src/main/java/org/etsi/osl/metrico/prometheus/PrometheusQueries.java b/src/main/java/org/etsi/osl/metrico/prometheus/PrometheusQueries.java index 95491d7..985aec7 100644 --- a/src/main/java/org/etsi/osl/metrico/prometheus/PrometheusQueries.java +++ b/src/main/java/org/etsi/osl/metrico/prometheus/PrometheusQueries.java @@ -19,7 +19,6 @@ import reactor.core.publisher.Mono; import java.time.Duration; import java.time.OffsetDateTime; -import java.time.ZoneOffset; import java.util.concurrent.TimeUnit; @Component diff --git a/src/main/java/org/etsi/osl/metrico/services/MetricoService.java b/src/main/java/org/etsi/osl/metrico/services/MetricoService.java index f90737c..4dd52ee 100644 --- a/src/main/java/org/etsi/osl/metrico/services/MetricoService.java +++ b/src/main/java/org/etsi/osl/metrico/services/MetricoService.java @@ -24,7 +24,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.context.event.ApplicationStartedEvent; import org.springframework.context.event.EventListener; - import org.springframework.stereotype.Service; import java.net.URI; diff --git a/src/test/java/org/etsi/osl/metrico/JsonUtilTest.java b/src/test/java/org/etsi/osl/metrico/JsonUtilTest.java index b84de03..2bc38cf 100644 --- a/src/test/java/org/etsi/osl/metrico/JsonUtilTest.java +++ b/src/test/java/org/etsi/osl/metrico/JsonUtilTest.java @@ -1,13 +1,10 @@ package org.etsi.osl.metrico; -import org.etsi.osl.tmf.pm628.model.DataAccessEndpoint; -import org.etsi.osl.tmf.pm628.model.ExecutionStateType; import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob; import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJobMVO; import org.junit.jupiter.api.Test; import java.io.IOException; -import java.util.UUID; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/org/etsi/osl/metrico/mapper/JobMapperTest.java b/src/test/java/org/etsi/osl/metrico/mapper/JobMapperTest.java index f8cc9a1..c9e1012 100644 --- a/src/test/java/org/etsi/osl/metrico/mapper/JobMapperTest.java +++ b/src/test/java/org/etsi/osl/metrico/mapper/JobMapperTest.java @@ -1,7 +1,10 @@ package org.etsi.osl.metrico.mapper; import org.etsi.osl.metrico.model.Job; -import org.etsi.osl.tmf.pm628.model.*; +import org.etsi.osl.tmf.pm628.model.DataAccessEndpoint; +import org.etsi.osl.tmf.pm628.model.Granularity; +import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob; +import org.etsi.osl.tmf.pm628.model.ScheduleDefinition; import org.junit.jupiter.api.Test; import java.net.URI; diff --git a/src/test/java/org/etsi/osl/metrico/model/JobTest.java b/src/test/java/org/etsi/osl/metrico/model/JobTest.java index aa5b6b0..eb3f79b 100644 --- a/src/test/java/org/etsi/osl/metrico/model/JobTest.java +++ b/src/test/java/org/etsi/osl/metrico/model/JobTest.java @@ -1,6 +1,5 @@ package org.etsi.osl.metrico.model; -import org.etsi.osl.tmf.pm628.model.DataAccessEndpoint; import org.etsi.osl.tmf.pm628.model.ExecutionStateType; import org.junit.jupiter.api.Test; diff --git a/src/test/java/org/etsi/osl/metrico/services/JobServiceTest.java b/src/test/java/org/etsi/osl/metrico/services/JobServiceTest.java index 9e6af25..904a25d 100644 --- a/src/test/java/org/etsi/osl/metrico/services/JobServiceTest.java +++ b/src/test/java/org/etsi/osl/metrico/services/JobServiceTest.java @@ -5,7 +5,6 @@ import org.etsi.osl.metrico.model.Job; import org.etsi.osl.tmf.pm628.model.ExecutionStateType; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; import java.time.OffsetDateTime; import java.util.UUID; -- GitLab From 5af4d0bb382e32efbbd8fca1bc05041460446288 Mon Sep 17 00:00:00 2001 From: George Tziavas Date: Wed, 25 Jun 2025 17:14:50 +0300 Subject: [PATCH 4/7] buggy --- .../osl/metrico/MetricoCommonMethods.java | 2 +- .../osl/metrico/services/MetricoService.java | 237 ++++++++++-------- .../services/MetricoServiceRouteBuilder.java | 3 +- src/main/resources/application-testing.yml | 3 +- 4 files changed, 133 insertions(+), 112 deletions(-) diff --git a/src/main/java/org/etsi/osl/metrico/MetricoCommonMethods.java b/src/main/java/org/etsi/osl/metrico/MetricoCommonMethods.java index acfc378..b194673 100644 --- a/src/main/java/org/etsi/osl/metrico/MetricoCommonMethods.java +++ b/src/main/java/org/etsi/osl/metrico/MetricoCommonMethods.java @@ -351,7 +351,7 @@ public class MetricoCommonMethods extends RouteBuilder { map.put("mcjid", mcjId); Object response = template.requestBodyAndHeaders(PM_MEASUREMENT_COLLECTION_JOB_UPDATE, JsonUtil.toJsonString(mcjMVO), map); - logger.info("JsonUtil.toJsonString(mcjMVO): \n{}", JsonUtil.toJsonString(mcjMVO)); + logger.debug("JsonUtil.toJsonString(mcjMVO): \n{}", JsonUtil.toJsonString(mcjMVO)); if (!(response instanceof String)) { logger.error("MeasurementCollectionJob object is wrong."); return null; diff --git a/src/main/java/org/etsi/osl/metrico/services/MetricoService.java b/src/main/java/org/etsi/osl/metrico/services/MetricoService.java index 4dd52ee..49117c8 100644 --- a/src/main/java/org/etsi/osl/metrico/services/MetricoService.java +++ b/src/main/java/org/etsi/osl/metrico/services/MetricoService.java @@ -11,6 +11,8 @@ import org.etsi.osl.tmf.common.model.ELifecycle; import org.etsi.osl.tmf.common.model.EValueType; import org.etsi.osl.tmf.common.model.Notification; import org.etsi.osl.tmf.common.model.service.Characteristic; +import org.etsi.osl.tmf.common.model.service.ServiceRef; +import org.etsi.osl.tmf.common.model.service.ServiceRelationship; import org.etsi.osl.tmf.common.model.service.ServiceStateType; import org.etsi.osl.tmf.pm628.model.*; import org.etsi.osl.tmf.rcm634.model.LogicalResourceSpecification; @@ -34,22 +36,22 @@ import java.util.List; @Service public class MetricoService extends RouteBuilder { - private static final Logger logger = LoggerFactory.getLogger(MetricoService.class); - public static final String OSL_METRICO_RSPEC_NAME = "METRICO_Resource_Specification"; public static final String OSL_METRICO_RSPEC_VERSION = "0.0.1"; public static final String OSL_METRICO_RSPEC_CATEGORY = "metrico.osl.etsi.org/v1"; public static final String OSL_METRICO_RSPEC_TYPE = "LogicalResourceSpecification"; public static final String OSL_METRICO_RSPEC_DESCRIPTION = "This Specification is used to describe a generic METRICO job resource"; + private static final Logger logger = LoggerFactory.getLogger(MetricoService.class); private static String OSL_METRICO_RSPEC_ID = null; private final MetricoCommonMethods metricoCommonMethods; private final PrometheusQueries prometheusQueries; private final JobService jobService; + public MetricoService(PrometheusQueries prometheusQueries, MetricoCommonMethods metricoCommonMethods, JobService jobService) { this.prometheusQueries = prometheusQueries; this.metricoCommonMethods = metricoCommonMethods; - this.jobService= jobService; + this.jobService = jobService; } @Override @@ -110,7 +112,7 @@ public class MetricoService extends RouteBuilder { logger.info("===== Looking for PENDING or IN_PROGRESS Measurement Collection Jobs from previous sessions ====="); List jobsPending = metricoCommonMethods.listPendingOrInProgressMeasurementCollectionJobs(); jobService.stopAllJobs(); - if(jobsPending != null){ + if (jobsPending != null) { logger.info("===== Started resuming PENDING or IN_PROGRESS Measurement Collection Jobs from previous sessions ====="); for (MeasurementCollectionJob measurementCollectionJob : jobsPending) { measurementCollectionJob = metricoCommonMethods.retrieveMeasurementCollectionJob(measurementCollectionJob.getUuid()); @@ -134,11 +136,11 @@ public class MetricoService extends RouteBuilder { // If the ScheduleDefinitionEndTime is null, set it to 1 hour after the ScheduleDefinitionStartTime to check if it is past due if (measurementCollectionJob.getScheduleDefinition().get(0).getScheduleDefinitionEndTime() == null && measurementCollectionJob.getScheduleDefinition().get(0).getScheduleDefinitionStartTime() != null) { measurementCollectionJob.getScheduleDefinition().get(0).setScheduleDefinitionEndTime(measurementCollectionJob.getScheduleDefinition().get(0).getScheduleDefinitionStartTime().plusHours(1)); - }else if (measurementCollectionJob.getScheduleDefinition().get(0).getScheduleDefinitionEndTime() == null && measurementCollectionJob.getScheduleDefinition().get(0).getScheduleDefinitionStartTime() == null) { + } else if (measurementCollectionJob.getScheduleDefinition().get(0).getScheduleDefinitionEndTime() == null && measurementCollectionJob.getScheduleDefinition().get(0).getScheduleDefinitionStartTime() == null) { measurementCollectionJob.getScheduleDefinition().get(0).setScheduleDefinitionEndTime(measurementCollectionJob.getCreationTime().plusHours(1)); } // If the ScheduleDefinitionEndTime is before the current time, skip the job - if(measurementCollectionJob.getScheduleDefinition().get(0).getScheduleDefinitionEndTime().isBefore(OffsetDateTime.now())) { + if (measurementCollectionJob.getScheduleDefinition().get(0).getScheduleDefinitionEndTime().isBefore(OffsetDateTime.now())) { logger.warn("MeasurementCollectionJob with uuid: {} has a ScheduleDefinition that has already ended, skipping.", measurementCollectionJob.getUuid()); MeasurementCollectionJobMVO mcjMVO = new MeasurementCollectionJobMVO(); @@ -152,7 +154,7 @@ public class MetricoService extends RouteBuilder { measurementCollectionJob.getScheduleDefinition().get(0).setScheduleDefinitionStartTime(measurementCollectionJob.getCreationTime()); measurementCollectionJob.getScheduleDefinition().get(0).setScheduleDefinitionEndTime(measurementCollectionJob.getCreationTime().plusHours(1)); - if(measurementCollectionJob.getScheduleDefinition().get(0).getScheduleDefinitionEndTime().isBefore(OffsetDateTime.now())) { + if (measurementCollectionJob.getScheduleDefinition().get(0).getScheduleDefinitionEndTime().isBefore(OffsetDateTime.now())) { logger.warn("MeasurementCollectionJob with uuid: {} has a ScheduleDefinition that has already ended, skipping.", measurementCollectionJob.getUuid()); MeasurementCollectionJobMVO mcjMVO = new MeasurementCollectionJobMVO(); @@ -187,7 +189,7 @@ public class MetricoService extends RouteBuilder { measurementCollectionJobMVO.setExecutionState(job.getState()); givenMCJ = metricoCommonMethods.updateMeasurementCollectionJobById(givenMCJ.getUuid(), measurementCollectionJobMVO); - if (givenMCJ!=null) { + if (givenMCJ != null) { metricoCommonMethods.updateRelatedResource(givenMCJ); } } @@ -211,121 +213,138 @@ public class MetricoService extends RouteBuilder { } } - public void handleServiceEvent(final Notification n){ + public void handleServiceEvent(final Notification n) { org.etsi.osl.tmf.sim638.model.Service service = null; + ServiceSpecification serviceSpec = null; + MeasurementCollectionJob mcj = null; + ResourceSpecificationRef rSpec = null; + boolean isMetricoRFSService = false; + boolean isRunningJob = false; - if (n instanceof ServiceStateChangeNotification){ + if (n instanceof ServiceStateChangeNotification) { service = ((ServiceStateChangeNotification) n).getEvent().getService(); - } else if (n instanceof ServiceDeleteNotification){ + } else if (n instanceof ServiceDeleteNotification) { service = ((ServiceDeleteNotification) n).getEvent().getService(); - } else if (n instanceof ServiceAttributeValueChangeNotification){ + } else if (n instanceof ServiceAttributeValueChangeNotification) { service = ((ServiceAttributeValueChangeNotification) n).getEvent().getService(); } - ServiceSpecification serviceSpec = null; + // Check if it is a METRICO RFS service if (service != null && service.getServiceSpecificationRef() != null) { serviceSpec = metricoCommonMethods.retrieveServiceSpecificationById(service.getServiceSpecificationRef().getId()); + if (serviceSpec != null && serviceSpec.getResourceSpecification().size() == 1) { + rSpec = serviceSpec.getResourceSpecification().iterator().next(); + if (rSpec.getId().equalsIgnoreCase(OSL_METRICO_RSPEC_ID)) { + isMetricoRFSService = true; + } + } + } else { + logger.debug("Service {} is not a METRICO service, skipping.", service.getId()); + return; } - if(serviceSpec != null){ - // Check if it is an RFS SPEC - if(serviceSpec.getResourceSpecification().size() == 1) { - // Check if it is a METRICO service - ResourceSpecificationRef rSpec = serviceSpec.getResourceSpecification().iterator().next(); - if (rSpec.getId().equalsIgnoreCase(OSL_METRICO_RSPEC_ID)) { - if (n instanceof ServiceStateChangeNotification && service.getState() == ServiceStateType.TERMINATED) { - logger.debug("Service {} is a METRICO service with state TERMINATED. Terminating related job.", service.getId()); - jobService.stopJob(String.valueOf(service.getServiceCharacteristicByName("_MT_MCJ_REFID").getValue().getValue())); - } - else if (n instanceof ServiceDeleteNotification){ - logger.debug("Service {} is a METRICO service that was deleted. Terminating related job.", service.getId()); - jobService.stopJob(String.valueOf(service.getServiceCharacteristicByName("_MT_MCJ_REFID").getValue().getValue())); - } - else if (n instanceof ServiceAttributeValueChangeNotification) { - logger.debug("Service {} is a METRICO service with state ACTIVE. Starting related job.", service.getId()); - MeasurementCollectionJobMVO mcjMVO = new MeasurementCollectionJobMVO(); - MeasurementCollectionJob mcjOld = metricoCommonMethods.retrieveMeasurementCollectionJob( - service.getServiceCharacteristicByName("_MT_MCJ_REFID").getValue().getValue() - ); - Characteristic serviceCharacteristic; - - if(!mcjOld.getProducingApplicationId().equals(service.getId())) { - mcjMVO.setProducingApplicationId(service.getServiceSpecificationRef().getId()); - } - serviceCharacteristic = service.getServiceCharacteristicByName("_MT_CHARACTERISTIC_NAME"); - String characteristicName = String.valueOf(serviceCharacteristic.getValue().getValue()); - if (metricoCommonMethods.notNullOrEmpty(characteristicName) && !mcjOld.getOutputFormat().equals(characteristicName)){ - mcjMVO.setOutputFormat(characteristicName); - } - serviceCharacteristic = service.getServiceCharacteristicByName("_MT_SERVICEUUID"); - String cfs_id = String.valueOf(serviceCharacteristic.getValue().getValue()); - if(metricoCommonMethods.notNullOrEmpty(cfs_id) && !mcjOld.getConsumingApplicationId().equals(cfs_id)) { - mcjMVO.setConsumingApplicationId(cfs_id); - } - ScheduleDefinitionMVO scheduleDefinitionNew = new ScheduleDefinitionMVO(); - ScheduleDefinition scheduleDefinitionOld = mcjOld.getScheduleDefinition().get(0); - boolean scheduleDefinitionChanged = false; - if(!scheduleDefinitionOld.getScheduleDefinitionStartTime().equals(service.getStartDate())){ - scheduleDefinitionNew.setScheduleDefinitionStartTime(service.getStartDate()); - scheduleDefinitionChanged = true; - } - if (!scheduleDefinitionOld.getScheduleDefinitionEndTime().equals(service.getEndDate())) { - scheduleDefinitionNew.setScheduleDefinitionEndTime(service.getEndDate()); - scheduleDefinitionChanged = true; - } - if (scheduleDefinitionChanged) { - mcjMVO.addScheduleDefinitionItem(scheduleDefinitionNew); - } - - serviceCharacteristic = service.getServiceCharacteristicByName("_MT_RECURRING_INTERVAL"); - String recurringIntervalString = String.valueOf(serviceCharacteristic.getValue().getValue()); - if(metricoCommonMethods.notNullOrEmpty(recurringIntervalString) && !mcjOld.getGranularity().toString().equalsIgnoreCase(recurringIntervalString)) { - if (Granularity.contains(recurringIntervalString)){ - mcjMVO.setGranularity(Granularity.valueOf(recurringIntervalString)); - } - } - - boolean dataAccessEndpointChanged = false; - DataAccessEndpointMVO daeMVO = new DataAccessEndpointMVO(); - DataAccessEndpoint daeOld = mcjOld.getDataAccessEndpoint().get(0); - serviceCharacteristic = service.getServiceCharacteristicByName("_MT_TYPE"); - String monitoringType = String.valueOf(serviceCharacteristic.getValue().getValue()); - if(metricoCommonMethods.notNullOrEmpty(monitoringType) && !daeOld.getApiType().equalsIgnoreCase(monitoringType)) { - daeMVO.setApiType(monitoringType); - dataAccessEndpointChanged = true; - } - - serviceCharacteristic = service.getServiceCharacteristicByName("_MT_QUERY"); - String monitoringQuery = String.valueOf(serviceCharacteristic.getValue().getValue()); - serviceCharacteristic = service.getServiceCharacteristicByName("_MT_URL"); - String monitoringURL = String.valueOf(serviceCharacteristic.getValue().getValue()); - URI newUri = null; - try { - newUri = new URI(monitoringURL + "?" + monitoringQuery); - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } - if(!daeOld.getUri().equals(newUri)) { - daeMVO.setUri(newUri); - dataAccessEndpointChanged = true; - } - if(dataAccessEndpointChanged) { - mcjMVO.addDataAccessEndpointItem(daeMVO); - } - - MeasurementCollectionJob updatedMCJ = metricoCommonMethods.updateMeasurementCollectionJobById( - mcjOld.getUuid(), mcjMVO); - jobService.stopJob(String.valueOf(service.getServiceCharacteristicByName("_MT_MCJ_REFID").getValue().getValue())); - startPeriodicQueryToPrometheus(updatedMCJ); - } - else { - logger.debug("Service {} is a METRICO service with state {}. No action taken.", service.getId(), service.getState()); - } - } else { - logger.debug("Service {} is not a METRICO service, skipping.", service.getId()); + if (isMetricoRFSService) { + String mcjRefId = service.getServiceCharacteristicByName("_MT_MCJ_REFID").getValue().getValue(); + mcj = metricoCommonMethods.retrieveMeasurementCollectionJob(mcjRefId); + + if(mcj.getExecutionState() !=null) { + if (mcj.getExecutionState().equals(ExecutionStateType.INPROGRESS) || mcj.getExecutionState().equals(ExecutionStateType.PENDING)) { + isRunningJob = true; } } } + + if (isMetricoRFSService) { + if (n instanceof ServiceStateChangeNotification && service.getState() == ServiceStateType.TERMINATED) { + logger.debug("Service {} is a METRICO service with state TERMINATED. Terminating related job.", service.getId()); + jobService.stopJob(String.valueOf(service.getServiceCharacteristicByName("_MT_MCJ_REFID").getValue().getValue())); + } else if (n instanceof ServiceDeleteNotification) { + logger.debug("Service {} is a METRICO service that was deleted. Terminating related job.", service.getId()); + jobService.stopJob(String.valueOf(service.getServiceCharacteristicByName("_MT_MCJ_REFID").getValue().getValue())); + } else if (n instanceof ServiceAttributeValueChangeNotification && isRunningJob) { + logger.debug("Service {} is a METRICO service that was updated. Updating related job.", service.getId()); + +// MeasurementCollectionJobMVO mcjMVO = new MeasurementCollectionJobMVO(); +// String mcjRefId = service.getServiceCharacteristicByName("_MT_MCJ_REFID").getValue().getValue(); +// MeasurementCollectionJob mcjOld = metricoCommonMethods.retrieveMeasurementCollectionJob(mcjRefId); +// Characteristic serviceCharacteristic; +// +// if (!mcjOld.getProducingApplicationId().equals(service.getId())) { +// mcjMVO.setProducingApplicationId(service.getServiceSpecificationRef().getId()); +// } +// serviceCharacteristic = service.getServiceCharacteristicByName("_MT_CHARACTERISTIC_NAME"); +// String characteristicName = String.valueOf(serviceCharacteristic.getValue().getValue()); +// if (metricoCommonMethods.notNullOrEmpty(characteristicName) && !mcjOld.getOutputFormat().equals(characteristicName)) { +// mcjMVO.setOutputFormat(characteristicName); +// } +// serviceCharacteristic = service.getServiceCharacteristicByName("_MT_SERVICEUUID"); +// String cfs_id = String.valueOf(serviceCharacteristic.getValue().getValue()); +// if (metricoCommonMethods.notNullOrEmpty(cfs_id) && !mcjOld.getConsumingApplicationId().equals(cfs_id)) { +// mcjMVO.setConsumingApplicationId(cfs_id); +// } +// ScheduleDefinitionMVO scheduleDefinitionNew = new ScheduleDefinitionMVO(); +// ScheduleDefinition scheduleDefinitionOld = mcjOld.getScheduleDefinition().get(0); +// boolean scheduleDefinitionChanged = false; +// if (!scheduleDefinitionOld.getScheduleDefinitionStartTime().equals(service.getStartDate())) { +// scheduleDefinitionNew.setScheduleDefinitionStartTime(service.getStartDate()); +// scheduleDefinitionChanged = true; +// } +// if (!scheduleDefinitionOld.getScheduleDefinitionEndTime().equals(service.getEndDate())) { +// scheduleDefinitionNew.setScheduleDefinitionEndTime(service.getEndDate()); +// scheduleDefinitionChanged = true; +// } +// if (scheduleDefinitionChanged) { +// mcjMVO.addScheduleDefinitionItem(scheduleDefinitionNew); +// } +// +// serviceCharacteristic = service.getServiceCharacteristicByName("_MT_RECURRING_INTERVAL"); +// String recurringIntervalString = String.valueOf(serviceCharacteristic.getValue().getValue()); +// if (metricoCommonMethods.notNullOrEmpty(recurringIntervalString) && !mcjOld.getGranularity().toString().equalsIgnoreCase(recurringIntervalString)) { +// if (Granularity.contains(recurringIntervalString)) { +// mcjMVO.setGranularity(Granularity.valueOf(recurringIntervalString)); +// } +// } +// +// boolean dataAccessEndpointChanged = false; +// DataAccessEndpointMVO daeMVO = new DataAccessEndpointMVO(); +// DataAccessEndpoint daeOld = mcjOld.getDataAccessEndpoint().get(0); +// serviceCharacteristic = service.getServiceCharacteristicByName("_MT_TYPE"); +// String monitoringType = String.valueOf(serviceCharacteristic.getValue().getValue()); +// if (metricoCommonMethods.notNullOrEmpty(monitoringType) && !daeOld.getApiType().equalsIgnoreCase(monitoringType)) { +// daeMVO.setApiType(monitoringType); +// dataAccessEndpointChanged = true; +// } +// +// serviceCharacteristic = service.getServiceCharacteristicByName("_MT_QUERY"); +// String monitoringQuery = String.valueOf(serviceCharacteristic.getValue().getValue()); +// serviceCharacteristic = service.getServiceCharacteristicByName("_MT_URL"); +// String monitoringURL = String.valueOf(serviceCharacteristic.getValue().getValue()); +// URI newUri = null; +// try { +// newUri = new URI(monitoringURL + "?" + monitoringQuery); +// } catch (URISyntaxException e) { +// throw new RuntimeException(e); +// } +// if (!daeOld.getUri().equals(newUri)) { +// daeMVO.setUri(newUri); +// dataAccessEndpointChanged = true; +// } +// if (dataAccessEndpointChanged) { +// mcjMVO.addDataAccessEndpointItem(daeMVO); +// } +// +// MeasurementCollectionJob updatedMCJ = metricoCommonMethods.updateMeasurementCollectionJobById( +// mcjOld.getUuid(), mcjMVO); +// jobService.stopJob(String.valueOf(service.getServiceCharacteristicByName("_MT_MCJ_REFID").getValue().getValue())); +// startPeriodicQueryToPrometheus(updatedMCJ); + } else { + logger.debug("Service {} is a METRICO service with state {}. No action taken.", service.getId(), service.getState()); + } + } else { + logger.debug("Service {} is not a METRICO RFS service, skipping.", service.getId()); + } } } + + diff --git a/src/main/java/org/etsi/osl/metrico/services/MetricoServiceRouteBuilder.java b/src/main/java/org/etsi/osl/metrico/services/MetricoServiceRouteBuilder.java index f1f0702..1bfda8e 100644 --- a/src/main/java/org/etsi/osl/metrico/services/MetricoServiceRouteBuilder.java +++ b/src/main/java/org/etsi/osl/metrico/services/MetricoServiceRouteBuilder.java @@ -32,7 +32,7 @@ public class MetricoServiceRouteBuilder extends RouteBuilder { @Value("${EVENT_SERVICE_DELETE}") private String EVENT_SERVICE_DELETE = ""; - @Value("${EVENT_SERVICE_ATTRIBUTE_VALUE_CHANGED}}") + @Value("${EVENT_SERVICE_ATTRIBUTE_VALUE_CHANGED}") private String EVENT_SERVICE_ATTRIBUTE_VALUE_CHANGED = ""; public void configure() throws Exception { @@ -57,6 +57,7 @@ public class MetricoServiceRouteBuilder extends RouteBuilder { .unmarshal() .json(JsonLibrary.Jackson, ServiceDeleteNotification.class, true) .bean(metricoService, "handleServiceEvent"); + from(EVENT_SERVICE_ATTRIBUTE_VALUE_CHANGED) .log(LoggingLevel.INFO, log, EVENT_SERVICE_ATTRIBUTE_VALUE_CHANGED + " message received!") .to("log:DEBUG?showBody=true&showHeaders=true") diff --git a/src/main/resources/application-testing.yml b/src/main/resources/application-testing.yml index 4e39bc3..74955cc 100644 --- a/src/main/resources/application-testing.yml +++ b/src/main/resources/application-testing.yml @@ -65,4 +65,5 @@ CATALOG_UPD_RESOURCE: "direct:CATALOG.UPD.RESOURCE" CATALOG_UPD_SERVICE: "direct:CATALOG.UPD.SERVICE" EVENT_SERVICE_STATE_CHANGED: "jms:topic:EVENT.SERVICE.STATECHANGED" -EVENT_SERVICE_DELETE: "jms:topic:EVENT.SERVICE.DELETE" \ No newline at end of file +EVENT_SERVICE_DELETE: "jms:topic:EVENT.SERVICE.DELETE" +EVENT_SERVICE_ATTRIBUTE_VALUE_CHANGED: "jms:topic:EVENT.SERVICE" \ No newline at end of file -- GitLab From eb0604b94c516a8b498795b067e87a2b7a173c88 Mon Sep 17 00:00:00 2001 From: George Tziavas Date: Thu, 3 Jul 2025 13:23:43 +0300 Subject: [PATCH 5/7] all working --- .../osl/metrico/MetricoCommonMethods.java | 2 + .../osl/metrico/services/MetricoService.java | 159 +++++++++--------- 2 files changed, 86 insertions(+), 75 deletions(-) diff --git a/src/main/java/org/etsi/osl/metrico/MetricoCommonMethods.java b/src/main/java/org/etsi/osl/metrico/MetricoCommonMethods.java index b194673..c015da7 100644 --- a/src/main/java/org/etsi/osl/metrico/MetricoCommonMethods.java +++ b/src/main/java/org/etsi/osl/metrico/MetricoCommonMethods.java @@ -350,6 +350,8 @@ public class MetricoCommonMethods extends RouteBuilder { Map map = new HashMap<>(); map.put("mcjid", mcjId); + String mcjMVOStr = JsonUtil.toJsonString(mcjMVO); + Object response = template.requestBodyAndHeaders(PM_MEASUREMENT_COLLECTION_JOB_UPDATE, JsonUtil.toJsonString(mcjMVO), map); logger.debug("JsonUtil.toJsonString(mcjMVO): \n{}", JsonUtil.toJsonString(mcjMVO)); if (!(response instanceof String)) { diff --git a/src/main/java/org/etsi/osl/metrico/services/MetricoService.java b/src/main/java/org/etsi/osl/metrico/services/MetricoService.java index 49117c8..baa0af5 100644 --- a/src/main/java/org/etsi/osl/metrico/services/MetricoService.java +++ b/src/main/java/org/etsi/osl/metrico/services/MetricoService.java @@ -253,9 +253,7 @@ public class MetricoService extends RouteBuilder { isRunningJob = true; } } - } - if (isMetricoRFSService) { if (n instanceof ServiceStateChangeNotification && service.getState() == ServiceStateType.TERMINATED) { logger.debug("Service {} is a METRICO service with state TERMINATED. Terminating related job.", service.getId()); jobService.stopJob(String.valueOf(service.getServiceCharacteristicByName("_MT_MCJ_REFID").getValue().getValue())); @@ -265,79 +263,90 @@ public class MetricoService extends RouteBuilder { } else if (n instanceof ServiceAttributeValueChangeNotification && isRunningJob) { logger.debug("Service {} is a METRICO service that was updated. Updating related job.", service.getId()); -// MeasurementCollectionJobMVO mcjMVO = new MeasurementCollectionJobMVO(); -// String mcjRefId = service.getServiceCharacteristicByName("_MT_MCJ_REFID").getValue().getValue(); -// MeasurementCollectionJob mcjOld = metricoCommonMethods.retrieveMeasurementCollectionJob(mcjRefId); -// Characteristic serviceCharacteristic; -// -// if (!mcjOld.getProducingApplicationId().equals(service.getId())) { -// mcjMVO.setProducingApplicationId(service.getServiceSpecificationRef().getId()); -// } -// serviceCharacteristic = service.getServiceCharacteristicByName("_MT_CHARACTERISTIC_NAME"); -// String characteristicName = String.valueOf(serviceCharacteristic.getValue().getValue()); -// if (metricoCommonMethods.notNullOrEmpty(characteristicName) && !mcjOld.getOutputFormat().equals(characteristicName)) { -// mcjMVO.setOutputFormat(characteristicName); -// } -// serviceCharacteristic = service.getServiceCharacteristicByName("_MT_SERVICEUUID"); -// String cfs_id = String.valueOf(serviceCharacteristic.getValue().getValue()); -// if (metricoCommonMethods.notNullOrEmpty(cfs_id) && !mcjOld.getConsumingApplicationId().equals(cfs_id)) { -// mcjMVO.setConsumingApplicationId(cfs_id); -// } -// ScheduleDefinitionMVO scheduleDefinitionNew = new ScheduleDefinitionMVO(); -// ScheduleDefinition scheduleDefinitionOld = mcjOld.getScheduleDefinition().get(0); -// boolean scheduleDefinitionChanged = false; -// if (!scheduleDefinitionOld.getScheduleDefinitionStartTime().equals(service.getStartDate())) { -// scheduleDefinitionNew.setScheduleDefinitionStartTime(service.getStartDate()); -// scheduleDefinitionChanged = true; -// } -// if (!scheduleDefinitionOld.getScheduleDefinitionEndTime().equals(service.getEndDate())) { -// scheduleDefinitionNew.setScheduleDefinitionEndTime(service.getEndDate()); -// scheduleDefinitionChanged = true; -// } -// if (scheduleDefinitionChanged) { -// mcjMVO.addScheduleDefinitionItem(scheduleDefinitionNew); -// } -// -// serviceCharacteristic = service.getServiceCharacteristicByName("_MT_RECURRING_INTERVAL"); -// String recurringIntervalString = String.valueOf(serviceCharacteristic.getValue().getValue()); -// if (metricoCommonMethods.notNullOrEmpty(recurringIntervalString) && !mcjOld.getGranularity().toString().equalsIgnoreCase(recurringIntervalString)) { -// if (Granularity.contains(recurringIntervalString)) { -// mcjMVO.setGranularity(Granularity.valueOf(recurringIntervalString)); -// } -// } -// -// boolean dataAccessEndpointChanged = false; -// DataAccessEndpointMVO daeMVO = new DataAccessEndpointMVO(); -// DataAccessEndpoint daeOld = mcjOld.getDataAccessEndpoint().get(0); -// serviceCharacteristic = service.getServiceCharacteristicByName("_MT_TYPE"); -// String monitoringType = String.valueOf(serviceCharacteristic.getValue().getValue()); -// if (metricoCommonMethods.notNullOrEmpty(monitoringType) && !daeOld.getApiType().equalsIgnoreCase(monitoringType)) { -// daeMVO.setApiType(monitoringType); -// dataAccessEndpointChanged = true; -// } -// -// serviceCharacteristic = service.getServiceCharacteristicByName("_MT_QUERY"); -// String monitoringQuery = String.valueOf(serviceCharacteristic.getValue().getValue()); -// serviceCharacteristic = service.getServiceCharacteristicByName("_MT_URL"); -// String monitoringURL = String.valueOf(serviceCharacteristic.getValue().getValue()); -// URI newUri = null; -// try { -// newUri = new URI(monitoringURL + "?" + monitoringQuery); -// } catch (URISyntaxException e) { -// throw new RuntimeException(e); -// } -// if (!daeOld.getUri().equals(newUri)) { -// daeMVO.setUri(newUri); -// dataAccessEndpointChanged = true; -// } -// if (dataAccessEndpointChanged) { -// mcjMVO.addDataAccessEndpointItem(daeMVO); -// } -// -// MeasurementCollectionJob updatedMCJ = metricoCommonMethods.updateMeasurementCollectionJobById( -// mcjOld.getUuid(), mcjMVO); -// jobService.stopJob(String.valueOf(service.getServiceCharacteristicByName("_MT_MCJ_REFID").getValue().getValue())); -// startPeriodicQueryToPrometheus(updatedMCJ); + MeasurementCollectionJobMVO mcjMVO = new MeasurementCollectionJobMVO(); + + mcjMVO.setExecutionState(ExecutionStateType.PENDING); + + MeasurementCollectionJob mcjOld = metricoCommonMethods.retrieveMeasurementCollectionJob(mcjRefId); + Characteristic serviceCharacteristic; + + if (!mcjOld.getProducingApplicationId().equals(service.getId())) { + mcjMVO.setProducingApplicationId(service.getServiceSpecificationRef().getId()); + } + serviceCharacteristic = service.getServiceCharacteristicByName("_MT_CHARACTERISTIC_NAME"); + String characteristicName = String.valueOf(serviceCharacteristic.getValue().getValue()); + if (metricoCommonMethods.notNullOrEmpty(characteristicName) && !mcjOld.getOutputFormat().equals(characteristicName)) { + mcjMVO.setOutputFormat(characteristicName); + } + serviceCharacteristic = service.getServiceCharacteristicByName("_MT_SERVICEUUID"); + String cfs_id = String.valueOf(serviceCharacteristic.getValue().getValue()); + if (metricoCommonMethods.notNullOrEmpty(cfs_id) && !mcjOld.getConsumingApplicationId().equals(cfs_id)) { + mcjMVO.setConsumingApplicationId(cfs_id); + } + ScheduleDefinitionMVO scheduleDefinitionNew = new ScheduleDefinitionMVO(); + ScheduleDefinition scheduleDefinitionOld = mcjOld.getScheduleDefinition().get(0); + boolean scheduleDefinitionChanged = false; + if (!scheduleDefinitionOld.getScheduleDefinitionStartTime().equals(service.getStartDate())) { + scheduleDefinitionNew.setScheduleDefinitionStartTime(service.getStartDate()); + scheduleDefinitionChanged = true; + } + if (!scheduleDefinitionOld.getScheduleDefinitionEndTime().equals(service.getEndDate())) { + scheduleDefinitionNew.setScheduleDefinitionEndTime(service.getEndDate()); + scheduleDefinitionChanged = true; + } + if (scheduleDefinitionChanged) { + mcjMVO.addScheduleDefinitionItem(scheduleDefinitionNew); + } + + serviceCharacteristic = service.getServiceCharacteristicByName("_MT_RECURRING_INTERVAL"); + String recurringIntervalString = String.valueOf(serviceCharacteristic.getValue().getValue()); + if (metricoCommonMethods.notNullOrEmpty(recurringIntervalString) && !mcjOld.getGranularity().toString().equalsIgnoreCase(recurringIntervalString)) { + if (Granularity.contains(recurringIntervalString)) { + mcjMVO.setGranularity(Granularity.valueOf(recurringIntervalString)); + } + } + + boolean monitoringTypeChanged = false; + DataAccessEndpointMVO daeMVO = new DataAccessEndpointMVO(); + DataAccessEndpoint daeOld = mcjOld.getDataAccessEndpoint().get(0); + serviceCharacteristic = service.getServiceCharacteristicByName("_MT_TYPE"); + String monitoringType = String.valueOf(serviceCharacteristic.getValue().getValue()); + if (metricoCommonMethods.notNullOrEmpty(monitoringType) && !daeOld.getApiType().equalsIgnoreCase(monitoringType)) { + daeMVO.setApiType(monitoringType); + monitoringTypeChanged = true; + } + + boolean uriChanged = false; + serviceCharacteristic = service.getServiceCharacteristicByName("_MT_QUERY"); + String monitoringQuery = String.valueOf(serviceCharacteristic.getValue().getValue()); + serviceCharacteristic = service.getServiceCharacteristicByName("_MT_URL"); + String monitoringURL = String.valueOf(serviceCharacteristic.getValue().getValue()); + URI newUri = null; + try { + newUri = new URI(monitoringURL + "?" + monitoringQuery); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + if (!daeOld.getUri().equals(newUri)) { + daeMVO.setUri(newUri); + uriChanged = true; + } + // This is a workaround because the APIType and URI are not mutually exclusive in the MVO. + // If the monitoring type has changed, we keep the old URI, and if the URI has changed, we keep the old APIType. + if(monitoringTypeChanged && !uriChanged) { + daeMVO.setUri(daeOld.getUri()); + } else if ((!monitoringTypeChanged) && uriChanged) { + daeMVO.setApiType(daeOld.getApiType()); + } + + if (uriChanged || monitoringTypeChanged) { + mcjMVO.addDataAccessEndpointItem(daeMVO); + } + + MeasurementCollectionJob updatedMCJ = metricoCommonMethods.updateMeasurementCollectionJobById( + mcjOld.getUuid(), mcjMVO); + jobService.stopJob(String.valueOf(service.getServiceCharacteristicByName("_MT_MCJ_REFID").getValue().getValue())); + startPeriodicQueryToPrometheus(updatedMCJ); } else { logger.debug("Service {} is a METRICO service with state {}. No action taken.", service.getId(), service.getState()); } -- GitLab From b862e514aa5addc7a72fada529f957a37f657885 Mon Sep 17 00:00:00 2001 From: George Tziavas Date: Thu, 3 Jul 2025 13:36:52 +0300 Subject: [PATCH 6/7] first stop METRICO service them update mcj --- .../java/org/etsi/osl/metrico/services/MetricoService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/etsi/osl/metrico/services/MetricoService.java b/src/main/java/org/etsi/osl/metrico/services/MetricoService.java index baa0af5..d1698b8 100644 --- a/src/main/java/org/etsi/osl/metrico/services/MetricoService.java +++ b/src/main/java/org/etsi/osl/metrico/services/MetricoService.java @@ -343,9 +343,11 @@ public class MetricoService extends RouteBuilder { mcjMVO.addDataAccessEndpointItem(daeMVO); } + jobService.stopJob(String.valueOf(service.getServiceCharacteristicByName("_MT_MCJ_REFID").getValue().getValue())); + MeasurementCollectionJob updatedMCJ = metricoCommonMethods.updateMeasurementCollectionJobById( mcjOld.getUuid(), mcjMVO); - jobService.stopJob(String.valueOf(service.getServiceCharacteristicByName("_MT_MCJ_REFID").getValue().getValue())); + startPeriodicQueryToPrometheus(updatedMCJ); } else { logger.debug("Service {} is a METRICO service with state {}. No action taken.", service.getId(), service.getState()); -- GitLab From 7c633983ef5b52f6047894cd970ac147c1061f42 Mon Sep 17 00:00:00 2001 From: George Tziavas Date: Thu, 3 Jul 2025 13:39:56 +0300 Subject: [PATCH 7/7] optimise imports --- src/main/java/org/etsi/osl/metrico/MetricoCommonMethods.java | 2 -- .../java/org/etsi/osl/metrico/services/MetricoService.java | 2 -- .../java/org/etsi/osl/metrico/MetricoCommonMethodsTest.java | 4 +++- .../osl/metrico/services/MetricoServiceRouteBuilderTest.java | 5 ++--- 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/etsi/osl/metrico/MetricoCommonMethods.java b/src/main/java/org/etsi/osl/metrico/MetricoCommonMethods.java index c015da7..b194673 100644 --- a/src/main/java/org/etsi/osl/metrico/MetricoCommonMethods.java +++ b/src/main/java/org/etsi/osl/metrico/MetricoCommonMethods.java @@ -350,8 +350,6 @@ public class MetricoCommonMethods extends RouteBuilder { Map map = new HashMap<>(); map.put("mcjid", mcjId); - String mcjMVOStr = JsonUtil.toJsonString(mcjMVO); - Object response = template.requestBodyAndHeaders(PM_MEASUREMENT_COLLECTION_JOB_UPDATE, JsonUtil.toJsonString(mcjMVO), map); logger.debug("JsonUtil.toJsonString(mcjMVO): \n{}", JsonUtil.toJsonString(mcjMVO)); if (!(response instanceof String)) { diff --git a/src/main/java/org/etsi/osl/metrico/services/MetricoService.java b/src/main/java/org/etsi/osl/metrico/services/MetricoService.java index d1698b8..94ce0be 100644 --- a/src/main/java/org/etsi/osl/metrico/services/MetricoService.java +++ b/src/main/java/org/etsi/osl/metrico/services/MetricoService.java @@ -11,8 +11,6 @@ import org.etsi.osl.tmf.common.model.ELifecycle; import org.etsi.osl.tmf.common.model.EValueType; import org.etsi.osl.tmf.common.model.Notification; import org.etsi.osl.tmf.common.model.service.Characteristic; -import org.etsi.osl.tmf.common.model.service.ServiceRef; -import org.etsi.osl.tmf.common.model.service.ServiceRelationship; import org.etsi.osl.tmf.common.model.service.ServiceStateType; import org.etsi.osl.tmf.pm628.model.*; import org.etsi.osl.tmf.rcm634.model.LogicalResourceSpecification; diff --git a/src/test/java/org/etsi/osl/metrico/MetricoCommonMethodsTest.java b/src/test/java/org/etsi/osl/metrico/MetricoCommonMethodsTest.java index d66045b..c0d2c16 100644 --- a/src/test/java/org/etsi/osl/metrico/MetricoCommonMethodsTest.java +++ b/src/test/java/org/etsi/osl/metrico/MetricoCommonMethodsTest.java @@ -24,7 +24,9 @@ import org.springframework.boot.test.context.TestConfiguration; import java.io.IOException; import java.net.URI; import java.time.OffsetDateTime; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.StringJoiner; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/org/etsi/osl/metrico/services/MetricoServiceRouteBuilderTest.java b/src/test/java/org/etsi/osl/metrico/services/MetricoServiceRouteBuilderTest.java index 00da713..b72b6e1 100644 --- a/src/test/java/org/etsi/osl/metrico/services/MetricoServiceRouteBuilderTest.java +++ b/src/test/java/org/etsi/osl/metrico/services/MetricoServiceRouteBuilderTest.java @@ -1,11 +1,9 @@ package org.etsi.osl.metrico.services; import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.camel.CamelContext; import org.apache.camel.ProducerTemplate; import org.apache.camel.test.spring.junit5.CamelSpringBootTest; import org.etsi.osl.metrico.MetricoCommonMethods; -import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob; import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJobCreateEvent; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; @@ -14,7 +12,8 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.TestPropertySource; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.timeout; +import static org.mockito.Mockito.verify; @CamelSpringBootTest @SpringBootTest -- GitLab