Commit dc464663 authored by Christos Tranoris's avatar Christos Tranoris
Browse files

multiple fixes

parent 830b0b71
Loading
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
eclipse.preferences.version=1
encoding//src/main/java=utf-8
encoding//src/main/resources=UTF-8
encoding//src/main/resources=utf-8
encoding//src/test/java=utf-8
encoding//src/test/resources=UTF-8
encoding//src/test/resources=utf-8
encoding/<project>=UTF-8
+1 −1
Original line number Diff line number Diff line
@@ -15,7 +15,7 @@ public interface AttachmentRefMapper {
    @Mapping(source = "url", target = "url")
    @Mapping(source = "referredType", target = "referredType")
    @Mapping(source = "type", target = "type")
    @Mapping(source = "baseType", target = "baseType")
    @Mapping(source = "atBaseType", target = "baseType")
    @Mapping(source = "schemaLocation", target = "schemaLocation")
    @Mapping(source = "href", target = "href")
    AttachmentRef toAttachmentRef(AttachmentRefMVO attachmentRefMVO);
+4 −4
Original line number Diff line number Diff line
@@ -6,10 +6,10 @@ import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper(uses = {
        DataFilterTemplateMapper.class,
        DataFilterAttributeStringArrayMapper.class
})
//@Mapper(uses = {
//        DataFilterTemplateMapper.class,
//        DataFilterAttributeStringArrayMapper.class
//})
public interface DataFilterMapItemMapper {
    DataFilterMapItemMapper INSTANCE = Mappers.getMapper(DataFilterMapItemMapper.class);

+1 −1
Original line number Diff line number Diff line
@@ -83,7 +83,7 @@ public class JobMapper {
                }
                return switch (unit.toUpperCase()) {
                    case "SEC" -> amount;
                    case "MIN" -> amount * 60;
                    case "MN" -> amount * 60;
                    case "H" -> amount * 3600;
                    case "D" -> amount * 86400;
                    case "M" -> amount * 2592000; // Approximate value for a month
+215 −10
Original line number Diff line number Diff line
package org.etsi.osl.metrico.prometheus;

import org.apache.camel.ProducerTemplate;
import org.etsi.osl.metrico.mapper.DataAccessEndpointMapper;
import org.etsi.osl.metrico.model.Job;
import org.etsi.osl.metrico.services.JobService;
import org.etsi.osl.tmf.common.model.Any;
import org.etsi.osl.tmf.common.model.service.Characteristic;
import org.etsi.osl.tmf.pm628.model.DataAccessEndpoint;
import org.etsi.osl.tmf.pm628.model.DataAccessEndpointMVO;
import org.etsi.osl.tmf.pm628.model.DataFilterAttributeStringArray;
import org.etsi.osl.tmf.pm628.model.DataFilterMap;
import org.etsi.osl.tmf.pm628.model.DataFilterMapItem;
import org.etsi.osl.tmf.pm628.model.DataFilterTemplate;
import org.etsi.osl.tmf.pm628.model.ExecutionStateType;
import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob;
import org.etsi.osl.tmf.ri639.model.LogicalResource;
import org.etsi.osl.tmf.ri639.model.Resource;
import org.etsi.osl.tmf.ri639.model.ResourceUpdate;
import org.etsi.osl.tmf.sim638.model.ServiceUpdate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

import jakarta.validation.constraints.NotNull;
import java.io.IOException;
import java.time.Duration;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;

@Component
public class PrometheusQueries {
@@ -20,43 +45,223 @@ public class PrometheusQueries {
    private static final Logger logger = LoggerFactory.getLogger(PrometheusQueries.class);
    private final JobService jobService;
    

    @Value("${CATALOG_GET_SERVICE_BY_ID}")
    private String CATALOG_GET_SERVICE_BY_ID = "";
    

    @Value("${CATALOG_GET_RESOURCE_BY_ID}")
    private String CATALOG_GET_RESOURCE_BY_ID = "";
    

    @Value("${CATALOG_UPD_RESOURCE}")
    private String CATALOG_UPD_RESOURCE = "";
    

    @Value("${CATALOG_UPD_SERVICE}")
    private String CATALOG_UPD_SERVICE = "";
    

    @Autowired
    private ProducerTemplate template;
    

    public PrometheusQueries(JobService jobService) {
        this.jobService = jobService;
    }

    public String sendQueryToPrometheus(String prometheusUrl, String query) {
    public String sendQueryToPrometheus(String prometheusUrl, String query, MeasurementCollectionJob mcj, Job job) {
        RestTemplate restTemplate = new RestTemplate();

        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(prometheusUrl)
                .path("/api/v1/query")
                .queryParam("query", query);
                .query(query);
        logger.atInfo().log("Sent query at prometheus with URL: " + prometheusUrl + " with query: " + query);
        logger.atInfo().log("Sent query  builder.toUriString(): " + builder.toUriString() );

        ResponseEntity<String> response = restTemplate.getForEntity(builder.toUriString(), String.class);

        logger.atDebug().log("Received " + response.getBody());
        
        String [] promResponse =response.getBody().split("\n");
        
        //patch TMF service
        String serviceUUID = mcj.getConsumingApplicationId();
        logger.atDebug().log("serviceUUID= " +  serviceUUID);
        
        ServiceUpdate su = new ServiceUpdate();
        
        Characteristic serviceCharacteristicItem =  new Characteristic();
        serviceCharacteristicItem.setName( mcj.getOutputFormat() );
        serviceCharacteristicItem.setValueType( "TEXT" );                    
        Any val = new Any();
        val.setValue( response.getBody() );
        val.setAlias( "");        
        serviceCharacteristicItem.setValue( val );
        su.addServiceCharacteristicItem(serviceCharacteristicItem);
        updateService(serviceUUID, su , true);
        return response.getBody();
    }

    public Job startPeriodicQuery(String prometheusUrl, String query, OffsetDateTime startDateTime, OffsetDateTime endDateTime, Integer executionInterval) {
    public Job startPeriodicQuery(String prometheusUrl, String query, final Job ajob, MeasurementCollectionJob mcj) {

        final Runnable queryHandler = () -> sendQueryToPrometheus(prometheusUrl, query);
      Job job = ajob;
      if (job.getStartDateTime() == null){
        job.setStartDateTime(OffsetDateTime.now());
      }
      if (job.getEndDateTime() == null){
          job.setEndDateTime(job.getStartDateTime().plusHours(1));
      }
      if(job.getExecutionInterval() == null){
          job.setExecutionInterval(180);
      }
    
    
        final Runnable queryHandler = () -> sendQueryToPrometheus(prometheusUrl, query, mcj, ajob);

        Job job = jobService.startJob(queryHandler, startDateTime, endDateTime, executionInterval);
        job = jobService.startJob(queryHandler, job);
        if (job.getState() == ExecutionStateType.FAILED) {
            return job;
        }

        if (endDateTime != null) {
            long stopAfterSeconds = Duration.between(OffsetDateTime.now(), endDateTime).getSeconds();
        if (job.getEndDateTime() != null) {
            long stopAfterSeconds = Duration.between(OffsetDateTime.now(), job.getEndDateTime() ).getSeconds();
            UUID jobid = job.getUuid();
            JobService.getScheduler().schedule(() -> {
                JobService.stopJob(job.getUuid());
                job.setState(ExecutionStateType.COMPLETED);
                jobService.stopJob( jobid );
                //job.setState(ExecutionStateType.COMPLETED);
            }, stopAfterSeconds, TimeUnit.SECONDS);
        }

        return job;
    }
    
    
    
    public Resource retrieveResource(@NotNull String resourceID) {
      logger.info("will retrieve Resource instance from catalog resourceID=" + resourceID   );
      try {
          Object response = template.
                  requestBody( CATALOG_GET_RESOURCE_BY_ID, resourceID);

          if ( !(response instanceof String)) {
              logger.error("resource object is wrong.");
              return null;
          }
          LogicalResource rInstance = toJsonObj( (String)response, LogicalResource.class);
          
          return rInstance;
          
      }catch (Exception e) {
          logger.error("Cannot retrieve LogicalResource details from catalog. " + e.toString());
      }
      return null;
      
    }
    
    /**
     * Ger service instance via bus
     * @param serviceID
     * @return
     */
    public org.etsi.osl.tmf.sim638.model.Service retrieveService(String serviceID) {
        logger.info("will retrieve Service instance from catalog serviceID=" + serviceID   );
        try {
            Object response = template.
                    requestBody( CATALOG_GET_SERVICE_BY_ID, serviceID);

            if ( !(response instanceof String)) {
                logger.error("Service object is wrong.");
                return null;
            }
            org.etsi.osl.tmf.sim638.model.Service serviceInstance = toJsonObj( (String)response, org.etsi.osl.tmf.sim638.model.Service.class); 
            //logger.debug("retrieveService response is: " + response);
            return serviceInstance;
            
        }catch (Exception e) {
            logger.error("Cannot retrieve Service details from catalog. " + e.toString());
        }
        return null;
    }
    
    
    public Resource updateResourceById(String oslResourceId, ResourceUpdate rs) {


      logger.debug("will update Resource : " + oslResourceId );
      try {
        Map<String, Object> map = new HashMap<>();
        map.put("resourceId", oslResourceId );
        map.put("triggerServiceActionQueue", false );

        Object response = template.requestBodyAndHeaders( CATALOG_UPD_RESOURCE, toJsonString(rs), map);

        if ( !(response instanceof String)) {
          logger.error("Service Instance object is wrong.");
        }

        LogicalResource resourceInstance = toJsonObj( (String)response, LogicalResource.class); 
        //logger.debug("createService response is: " + response);
        return resourceInstance;


      }catch (Exception e) {
        e.printStackTrace();
        logger.error("Cannot update Service: " + oslResourceId + ": " + e.toString());
      }
      return null;
    }

    
    /**
     * @param serviceId
     * @param s
     * @param triggerServiceActionQueue is a cryptic thing. However it is used as follows: if FALSE, to just update the service status in catalog without further taking any action.
     * if TRUE then the ServiceUpdate will trigger a ServiceActionQueue to further process the update. So this is needed to avoid these kinds of deadlocks
     * @return
     */
    public org.etsi.osl.tmf.sim638.model.Service updateService(String serviceId, ServiceUpdate s, boolean triggerServiceActionQueue) {
        logger.info("will update Service : " + serviceId );
        try {
            Map<String, Object> map = new HashMap<>();
            map.put("serviceid", serviceId );
            map.put("triggerServiceActionQueue", triggerServiceActionQueue );
            
            Object response = template.requestBodyAndHeaders( CATALOG_UPD_SERVICE, toJsonString(s), map);

            if ( !(response instanceof String)) {
                logger.error("Service Instance object is wrong.");
            }

            org.etsi.osl.tmf.sim638.model.Service serviceInstance = toJsonObj( (String)response, org.etsi.osl.tmf.sim638.model.Service.class); 
            //logger.debug("createService response is: " + response);
            return serviceInstance;
            
            
        }catch (Exception e) {
            logger.error("Cannot update Service: " + serviceId + ": " + e.toString());
        }
        return null;
        
    }

    
    
    
    
    static <T> T toJsonObj(String content, Class<T> valueType)  throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        return mapper.readValue( content, valueType);
    }

     static String toJsonString(Object object) throws IOException {
            ObjectMapper mapper = new ObjectMapper();
            mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
            return mapper.writeValueAsString(object);
        }


}

Loading