Loading src/main/java/org/etsi/osl/metrico/MetricoRouteBuilder.java +0 −1 Original line number Diff line number Diff line Loading @@ -37,7 +37,6 @@ public class MetricoRouteBuilder extends RouteBuilder { from(MEASUREMENT_COLLECTION_JOB_CREATED) .log(LoggingLevel.INFO, log, MEASUREMENT_COLLECTION_JOB_CREATED + "message received!") .to("log:DEBUG?showBody=true&showHeaders=true") .process(exchange -> prometheusQueries.startPeriodicQuery()) .setBody(simple("Message received and processed")) .to(MEASUREMENT_COLLECTION_JOB_RESPONSE); Loading src/main/java/org/etsi/osl/metrico/mapper/JobMapper.java +53 −12 Original line number Diff line number Diff line package org.etsi.osl.metrico.mapper; import jakarta.validation.Valid; import org.etsi.osl.metrico.model.Job; import org.etsi.osl.tmf.pm628.model.DataAccessEndpoint; import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob; import org.etsi.osl.metrico.model.SupportedDataAccessEndpoints; import org.etsi.osl.tmf.pm628.model.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; public class JobMapper { Loading @@ -16,33 +19,71 @@ public class JobMapper { Job job = new Job(); job.setMeasurementCollectionJobRef(UUID.fromString(measurementCollectionJob.getUuid())); if(measurementCollectionJob.getDataAccessEndpoint().size()!=1){ throw new IllegalArgumentException("DataAccessEndpoint should be exactly one"); }else { DataAccessEndpoint dataAccessEndpoint = measurementCollectionJob.getDataAccessEndpoint().get(0); job.setDataAccessEndPointRef(UUID.fromString(dataAccessEndpoint.getUuid())); if( dataAccessEndpoint.getApiType().equalsIgnoreCase("PROMETHEUS")){ if(SupportedDataAccessEndpoints.contains(dataAccessEndpoint.getApiType())){ job.setApiType(dataAccessEndpoint.getApiType()); } else if (dataAccessEndpoint.getApiType() == null ) { throw new IllegalArgumentException("API type needs to be defined"); }else{ throw new IllegalArgumentException("API type not supported"); throw new IllegalArgumentException("API type " + dataAccessEndpoint.getApiType() + " not supported"); } if(dataAccessEndpoint.getUri()!=null){ job.setDataAccessEndPointUri(dataAccessEndpoint.getUri()); } else { throw new IllegalArgumentException("DataAccessEndpointUri cannot be null"); } job.setDateAccessEndPointUri(dataAccessEndpoint.getUri()); job.setQuery(dataAccessEndpoint.getUriQueryFilter()); if(measurementCollectionJob.getJobCollectionFilter().getMappings().size() == 1){ DataFilterMap query = measurementCollectionJob.getJobCollectionFilter(); // String stringQuery = measurementCollectionJob.getJobCollectionFilter().getMappings().get(0).getFilterTemplate().getDescription(); job.setQuery(query); } else { throw new IllegalArgumentException("There should be exactly one query"); } } job.setStartDateTime(measurementCollectionJob.getScheduleDefinition().get(0).getScheduleDefinitionStartTime()); job.setEndDateTime(measurementCollectionJob.getScheduleDefinition().get(0).getScheduleDefinitionEndTime()); /* Extend the reporting period and granularitypossible values job.setStartDateTime(measurementCollectionJob.getReportingPeriod()); job.setExecutionInterval(measurementCollectionJob.getGranularity()); */ // job.setStartDateTime(measurementCollectionJob.getReportingPeriod()); @Valid Granularity granularity = measurementCollectionJob.getGranularity(); job.setExecutionInterval(convertGranularityToSeconds(measurementCollectionJob.getGranularity().getValue())); logger.atDebug().setMessage("Received MeasurementCollectionJob:\n" + measurementCollectionJob + "\nConverted it to Job:\n" + job).log(); return job; } public static int convertGranularityToSeconds(String value) { Pattern PATTERN = Pattern.compile("G_(\\d+)(SEC|MN|H|D|M|Y)"); if (Granularity.contains(value)) { Matcher matcher = PATTERN.matcher(value); if (matcher.matches()) { int amount = Integer.parseInt(matcher.group(1)); String unit = matcher.group(2); if(value.equalsIgnoreCase(Granularity.NA.getValue())){ return Integer.parseInt(null); } return switch (unit) { case "SEC" -> amount; case "MIN" -> amount * 60; case "H" -> amount * 3600; case "D" -> amount * 86400; case "M" -> amount * 2592000; // Approximate value for a month case "Y" -> amount * 31536000; // Approximate value for a year default -> throw new IllegalArgumentException("Unknown Granularity unit: " + unit); }; } } throw new IllegalArgumentException("Invalid Granularity format: " + value); } } src/main/java/org/etsi/osl/metrico/model/Job.java +1 −1 Original line number Diff line number Diff line Loading @@ -45,7 +45,7 @@ public class Job{ // Should I check the granularity or the scheduleDefinitionRef for the recurringFrequency? private UUID measurementCollectionJobRef; private URI dateAccessEndPointUri; private URI dataAccessEndPointUri; private DataFilterMap query; Loading src/main/java/org/etsi/osl/metrico/model/SupportedDataAccessEndpoints.java 0 → 100644 +16 −0 Original line number Diff line number Diff line package org.etsi.osl.metrico.model; public enum SupportedDataAccessEndpoints { PROMETHEUS; public static boolean contains(String apiType) { try { SupportedDataAccessEndpoints.valueOf(apiType.toUpperCase()); return true; } catch (IllegalArgumentException e) { return false; } } } src/test/java/org/etsi/osl/metrico/mapper/JobMapperTest.java 0 → 100644 +51 −0 Original line number Diff line number Diff line package org.etsi.osl.metrico.mapper; import org.etsi.osl.tmf.pm628.model.DataAccessEndpoint; import org.etsi.osl.tmf.pm628.model.DataFilterMap; import org.etsi.osl.tmf.pm628.model.DataFilterMapItem; import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob; import org.jetbrains.annotations.NotNull; import java.net.URI; import java.util.*; public class JobMapperTest { public MeasurementCollectionJob measurementCollectionJobCreate() { MeasurementCollectionJob measurementCollectionJob = new MeasurementCollectionJob(); List<DataAccessEndpoint> dataAccessEndpointList = new ArrayList<>(); dataAccessEndpointList.add(dataAccessEndpointCreate()); measurementCollectionJob.setUuid("9f22dc98-f439-4fdd-98e3-f6471cf8ca67"); measurementCollectionJob.setDataAccessEndpoint(dataAccessEndpointList); measurementCollectionJob.set return measurementCollectionJob; } public DataAccessEndpoint dataAccessEndpointCreate(){ DataAccessEndpoint dataAccessEndpoint = new DataAccessEndpoint(); dataAccessEndpoint.setUuid("123e4567-e89b-12d3-a456-426614174000"); dataAccessEndpoint.setUri(URI.create("example.com")); dataAccessEndpoint.setApiType("Prometheus"); return dataAccessEndpoint; } public DataFilterMap dataFilterMapCreate(){ DataFilterMap dataFilterMap = new DataFilterMap(); // dataFilterMap.setMappings(); return dataFilterMap; } public DataFilterMapItem dataFilterMapItemCreate(){ DataFilterMapItem dataFilterMapItem = new DataFilterMapItem(); dataFilterMapItem.setFilterTemplate(); } } Loading
src/main/java/org/etsi/osl/metrico/MetricoRouteBuilder.java +0 −1 Original line number Diff line number Diff line Loading @@ -37,7 +37,6 @@ public class MetricoRouteBuilder extends RouteBuilder { from(MEASUREMENT_COLLECTION_JOB_CREATED) .log(LoggingLevel.INFO, log, MEASUREMENT_COLLECTION_JOB_CREATED + "message received!") .to("log:DEBUG?showBody=true&showHeaders=true") .process(exchange -> prometheusQueries.startPeriodicQuery()) .setBody(simple("Message received and processed")) .to(MEASUREMENT_COLLECTION_JOB_RESPONSE); Loading
src/main/java/org/etsi/osl/metrico/mapper/JobMapper.java +53 −12 Original line number Diff line number Diff line package org.etsi.osl.metrico.mapper; import jakarta.validation.Valid; import org.etsi.osl.metrico.model.Job; import org.etsi.osl.tmf.pm628.model.DataAccessEndpoint; import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob; import org.etsi.osl.metrico.model.SupportedDataAccessEndpoints; import org.etsi.osl.tmf.pm628.model.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; public class JobMapper { Loading @@ -16,33 +19,71 @@ public class JobMapper { Job job = new Job(); job.setMeasurementCollectionJobRef(UUID.fromString(measurementCollectionJob.getUuid())); if(measurementCollectionJob.getDataAccessEndpoint().size()!=1){ throw new IllegalArgumentException("DataAccessEndpoint should be exactly one"); }else { DataAccessEndpoint dataAccessEndpoint = measurementCollectionJob.getDataAccessEndpoint().get(0); job.setDataAccessEndPointRef(UUID.fromString(dataAccessEndpoint.getUuid())); if( dataAccessEndpoint.getApiType().equalsIgnoreCase("PROMETHEUS")){ if(SupportedDataAccessEndpoints.contains(dataAccessEndpoint.getApiType())){ job.setApiType(dataAccessEndpoint.getApiType()); } else if (dataAccessEndpoint.getApiType() == null ) { throw new IllegalArgumentException("API type needs to be defined"); }else{ throw new IllegalArgumentException("API type not supported"); throw new IllegalArgumentException("API type " + dataAccessEndpoint.getApiType() + " not supported"); } if(dataAccessEndpoint.getUri()!=null){ job.setDataAccessEndPointUri(dataAccessEndpoint.getUri()); } else { throw new IllegalArgumentException("DataAccessEndpointUri cannot be null"); } job.setDateAccessEndPointUri(dataAccessEndpoint.getUri()); job.setQuery(dataAccessEndpoint.getUriQueryFilter()); if(measurementCollectionJob.getJobCollectionFilter().getMappings().size() == 1){ DataFilterMap query = measurementCollectionJob.getJobCollectionFilter(); // String stringQuery = measurementCollectionJob.getJobCollectionFilter().getMappings().get(0).getFilterTemplate().getDescription(); job.setQuery(query); } else { throw new IllegalArgumentException("There should be exactly one query"); } } job.setStartDateTime(measurementCollectionJob.getScheduleDefinition().get(0).getScheduleDefinitionStartTime()); job.setEndDateTime(measurementCollectionJob.getScheduleDefinition().get(0).getScheduleDefinitionEndTime()); /* Extend the reporting period and granularitypossible values job.setStartDateTime(measurementCollectionJob.getReportingPeriod()); job.setExecutionInterval(measurementCollectionJob.getGranularity()); */ // job.setStartDateTime(measurementCollectionJob.getReportingPeriod()); @Valid Granularity granularity = measurementCollectionJob.getGranularity(); job.setExecutionInterval(convertGranularityToSeconds(measurementCollectionJob.getGranularity().getValue())); logger.atDebug().setMessage("Received MeasurementCollectionJob:\n" + measurementCollectionJob + "\nConverted it to Job:\n" + job).log(); return job; } public static int convertGranularityToSeconds(String value) { Pattern PATTERN = Pattern.compile("G_(\\d+)(SEC|MN|H|D|M|Y)"); if (Granularity.contains(value)) { Matcher matcher = PATTERN.matcher(value); if (matcher.matches()) { int amount = Integer.parseInt(matcher.group(1)); String unit = matcher.group(2); if(value.equalsIgnoreCase(Granularity.NA.getValue())){ return Integer.parseInt(null); } return switch (unit) { case "SEC" -> amount; case "MIN" -> amount * 60; case "H" -> amount * 3600; case "D" -> amount * 86400; case "M" -> amount * 2592000; // Approximate value for a month case "Y" -> amount * 31536000; // Approximate value for a year default -> throw new IllegalArgumentException("Unknown Granularity unit: " + unit); }; } } throw new IllegalArgumentException("Invalid Granularity format: " + value); } }
src/main/java/org/etsi/osl/metrico/model/Job.java +1 −1 Original line number Diff line number Diff line Loading @@ -45,7 +45,7 @@ public class Job{ // Should I check the granularity or the scheduleDefinitionRef for the recurringFrequency? private UUID measurementCollectionJobRef; private URI dateAccessEndPointUri; private URI dataAccessEndPointUri; private DataFilterMap query; Loading
src/main/java/org/etsi/osl/metrico/model/SupportedDataAccessEndpoints.java 0 → 100644 +16 −0 Original line number Diff line number Diff line package org.etsi.osl.metrico.model; public enum SupportedDataAccessEndpoints { PROMETHEUS; public static boolean contains(String apiType) { try { SupportedDataAccessEndpoints.valueOf(apiType.toUpperCase()); return true; } catch (IllegalArgumentException e) { return false; } } }
src/test/java/org/etsi/osl/metrico/mapper/JobMapperTest.java 0 → 100644 +51 −0 Original line number Diff line number Diff line package org.etsi.osl.metrico.mapper; import org.etsi.osl.tmf.pm628.model.DataAccessEndpoint; import org.etsi.osl.tmf.pm628.model.DataFilterMap; import org.etsi.osl.tmf.pm628.model.DataFilterMapItem; import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob; import org.jetbrains.annotations.NotNull; import java.net.URI; import java.util.*; public class JobMapperTest { public MeasurementCollectionJob measurementCollectionJobCreate() { MeasurementCollectionJob measurementCollectionJob = new MeasurementCollectionJob(); List<DataAccessEndpoint> dataAccessEndpointList = new ArrayList<>(); dataAccessEndpointList.add(dataAccessEndpointCreate()); measurementCollectionJob.setUuid("9f22dc98-f439-4fdd-98e3-f6471cf8ca67"); measurementCollectionJob.setDataAccessEndpoint(dataAccessEndpointList); measurementCollectionJob.set return measurementCollectionJob; } public DataAccessEndpoint dataAccessEndpointCreate(){ DataAccessEndpoint dataAccessEndpoint = new DataAccessEndpoint(); dataAccessEndpoint.setUuid("123e4567-e89b-12d3-a456-426614174000"); dataAccessEndpoint.setUri(URI.create("example.com")); dataAccessEndpoint.setApiType("Prometheus"); return dataAccessEndpoint; } public DataFilterMap dataFilterMapCreate(){ DataFilterMap dataFilterMap = new DataFilterMap(); // dataFilterMap.setMappings(); return dataFilterMap; } public DataFilterMapItem dataFilterMapItemCreate(){ DataFilterMapItem dataFilterMapItem = new DataFilterMapItem(); dataFilterMapItem.setFilterTemplate(); } }