Commit 558674fa authored by Christos Tranoris's avatar Christos Tranoris
Browse files

update product order process

parent 2cf4b319
Loading
Loading
Loading
Loading
+97 −0
Original line number Diff line number Diff line
/*-
 * ========================LICENSE_START=================================
 * org.etsi.osl.osom
 * %%
 * Copyright (C) 2019 openslice.io
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * =========================LICENSE_END==================================
 */
package org.etsi.osl.osom.management;

import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.etsi.osl.tmf.po622.model.ProductOrder;
import org.etsi.osl.tmf.po622.model.ProductOrderStateType;
import org.etsi.osl.tmf.so641.model.ServiceOrder;
import org.etsi.osl.tmf.so641.model.ServiceOrderStateType;
import org.flowable.engine.TaskService;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.JavaDelegate;
import org.flowable.task.api.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component(value = "fetchAcknowledgedProductOrders") // bean name
public class FetchAcknowledgedProductOrders implements JavaDelegate {

	private static final transient Log logger = LogFactory.getLog(FetchAcknowledgedProductOrders.class.getName());


    @Autowired
    private ProductOrderManager productOrderManager;

    @Autowired
    private ServiceOrderManager serviceOrderManager;

	@Autowired
	private TaskService taskService;

	
	public void execute(DelegateExecution execution) {
		logger.info("======================" + execution.getProcessDefinitionId()  + "======================================");
		logger.info("FetchAcknowledgedProductOrders by Product Order Repository");

		List<String> ordersToBeProcessed = null;
		if (execution.getVariable("productOrdersToBeProcessed") instanceof ArrayList) {
			ordersToBeProcessed = (ArrayList<String>) execution.getVariable("productOrdersToBeProcessed");
			for (String orderid : ordersToBeProcessed) {
				logger.info("productOrdersToBeProcessed From Previous = " + orderid);
			}
		} else {
			ordersToBeProcessed = new ArrayList<>();
		}

		List<String> orderlist = productOrderManager.retrieveOrdersByState( ProductOrderStateType.ACKNOWLEDGED );
		
		if ( orderlist != null ) {
			for (String orderid : orderlist) {
				if ( !ordersToBeProcessed.contains( orderid )  ) {
					

					ProductOrder sor = productOrderManager.retrieveProductOrder( orderid );
					if ( sor !=null && sor.getRequestedStartDate() != null ) {
						Instant instant = Instant.now() ;                          // Capture the current moment as seen in UTC.
						boolean canStart = sor.getRequestedStartDate().toInstant().isBefore( instant ) ;
						
						if ( canStart ) {
							logger.info("Product order is scheduled to start now, orderid= "+ orderid +" date="+  sor.getRequestedStartDate().toInstant());
							ordersToBeProcessed.add( orderid );	
						} else {
							logger.info("Product order is scheduled to start later, orderid= " + orderid );
						}
					}
					
				}
			}	
		}
		
		execution.setVariable("productOrdersToBeProcessed", ordersToBeProcessed);
		


	}
}
+220 −0
Original line number Diff line number Diff line
/*-
 * ========================LICENSE_START=================================
 * org.etsi.osl.osom
 * %%
 * Copyright (C) 2019 openslice.io
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * =========================LICENSE_END==================================
 */
package org.etsi.osl.osom.management;

import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.etsi.osl.tmf.common.model.Any;
import org.etsi.osl.tmf.common.model.service.Characteristic;
import org.etsi.osl.tmf.common.model.service.Note;
import org.etsi.osl.tmf.common.model.service.ServiceSpecificationRef;
import org.etsi.osl.tmf.pcm620.model.ProductOffering;
import org.etsi.osl.tmf.pcm620.model.ProductOfferingRef;
import org.etsi.osl.tmf.pcm620.model.ProductSpecification;
import org.etsi.osl.tmf.po622.model.ProductOrder;
import org.etsi.osl.tmf.po622.model.ProductOrderItem;
import org.etsi.osl.tmf.po622.model.ProductOrderStateType;
import org.etsi.osl.tmf.po622.model.ProductOrderUpdate;
import org.etsi.osl.tmf.prm669.model.RelatedParty;
import org.etsi.osl.tmf.so641.model.ServiceOrder;
import org.etsi.osl.tmf.so641.model.ServiceOrderCreate;
import org.etsi.osl.tmf.so641.model.ServiceOrderItem;
import org.etsi.osl.tmf.so641.model.ServiceOrderStateType;
import org.etsi.osl.tmf.so641.model.ServiceRestriction;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.JavaDelegate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import jakarta.validation.Valid;

@Component(value = "initializeProcessProductOrders") // bean name
public class InitializeProcessProductOrders implements JavaDelegate {

	private static final transient Log logger = LogFactory.getLog(InitializeProcessProductOrders.class.getName());

	@Autowired
	private ProductOrderManager productOrderManager;
	

    @Autowired
    private ServiceOrderManager serviceOrderManager;
    

    @Value("${spring.application.name}")
    private String compname;

	@Autowired
	private RuntimeService runtimeService;

	public void execute(DelegateExecution execution) {

		logger.info("Check if there are new Product Orders for Orchestration: " + execution.getVariables().toString());
	

		if (execution.getVariable("productOrdersToBeProcessed") instanceof ArrayList) {

			List<String> ordersToBeProcessed = (ArrayList<String>) execution.getVariable("productOrdersToBeProcessed");
			for (String oId : ordersToBeProcessed) {

			  //process each order request
			  processOrderRequest( oId );
				
			}

		}

	}

  /**
   * For each product order create a service order and perform the neccessary references
   * @param oId
   */
  private void processOrderRequest(String oId) {
      
    //create equivalent service order
    ProductOrder prodOrder = productOrderManager.retrieveProductOrder(oId);
    logger.debug("Will send message that Product Order is IN-PROGRESS orderid= " + oId );
    
    ServiceOrder serviceOrder = createServiceOrderFromProductOrder(prodOrder);
    
    if (serviceOrder==null) {
      logger.error("Service Order is NULL " );
      
      return;
    }
    
    ProductOrderUpdate productOrderUpd = new ProductOrderUpdate();
    productOrderUpd.setState(ProductOrderStateType.INPROGRESS);
    for (ProductOrderItem poi : prodOrder.getProductOrderItem() ) {
      if ( poi.getProduct() != null ) {
        Characteristic charact = new Characteristic();
        charact.setName("_SERVICE_ORDER_ID_");
        charact.setValueType("TEXT");
        charact.setValue(new Any( serviceOrder.getId() ));        
        poi.getProduct().addProductCharacteristicItem(charact);
      }
      productOrderUpd.addProductOrderItemItem(poi);
    }
     
    productOrderManager.updateProducteOrder( oId, productOrderUpd );                    
    
  }

  private ServiceOrder createServiceOrderFromProductOrder(ProductOrder prodOrder) {


    ServiceOrderCreate servOrder = new ServiceOrderCreate();
    servOrder.setCategory("Automated order");
    servOrder.setDescription("Automatically created for product order " + prodOrder.getId());
    servOrder.setRequestedStartDate(prodOrder.getRequestedStartDate());
    servOrder.setRequestedCompletionDate(prodOrder.getExpectedCompletionDate());
    RelatedParty rpi = new RelatedParty();
    rpi.setName("OSOM-ProductOrder");
    rpi.setRole("REQUESTER");
    rpi.setId("OSOM-ProductOrder");
    servOrder.addRelatedPartyItem(rpi );

    Note noteItemOrder = new Note();
    noteItemOrder.text("Automatically created for product order " + prodOrder.getId());
    noteItemOrder.setAuthor(compname);
    servOrder.addNoteItem(noteItemOrder);

    for (ProductOrderItem poi : prodOrder.getProductOrderItem()) {
      @Valid
      ProductOfferingRef poffRefpoi = poi.getProductOffering();

      ProductOffering pOffer = productOrderManager.retrieveProductOffering(poffRefpoi.getId());
      if (pOffer == null) {
        logger.error("Product Order - ProductOffering in ProductOrderItem is NULL");
        return null;
      }
      
      if ( poi.getProduct() == null ) {
        logger.error("Product Order - Product in ProductOrderItem is NULL");
        return null;        
      }

      ProductSpecification pSepc =
          productOrderManager.retrieveProductSpec(poi.getProduct().getProductSpecification().getId());
      if (pSepc == null) {
        logger.error("Product Order - ProductSpecification in Product, ProductOrderItem is NULL");
        return null;
      }

      logger.debug("Product Order - ProductOffering name= " + pOffer.getName());
      logger.debug("Product Order - ProductSpecification name= " + pSepc.getName());


      for (ServiceSpecificationRef serviceSpec : pSepc.getServiceSpecification()) {
        ServiceOrderItem soi = new ServiceOrderItem();
        servOrder.getOrderItem().add(soi);
        soi.setState(ServiceOrderStateType.ACKNOWLEDGED);

        ServiceRestriction serviceRestriction = new ServiceRestriction();
        ServiceSpecificationRef aServiceSpecificationRef = new ServiceSpecificationRef();
        aServiceSpecificationRef.setId( serviceSpec.getId() );
        aServiceSpecificationRef.setName( serviceSpec.getName());
        aServiceSpecificationRef.setVersion( serviceSpec.getVersion());

        serviceRestriction.setServiceSpecification(aServiceSpecificationRef);

//        πρεπει να perasoyme τιμες από το product order στο service order item
//        εδω debug
        
        for (Characteristic servChar : poi.getProduct().getProductCharacteristic()  ) {
          servChar.setUuid(null);
          serviceRestriction.addServiceCharacteristicItem(servChar);
        }

        

        Characteristic refProductOrderChar = new Characteristic();
        refProductOrderChar.setName("_PRODUCT_ORDER_ID_");
        refProductOrderChar.setValueType("TEXT");
        refProductOrderChar.setValue(new Any( prodOrder.getId() ));
        serviceRestriction.addServiceCharacteristicItem(refProductOrderChar);
        
        Characteristic refProductOrderItemChar = new Characteristic();
        refProductOrderItemChar.setName("_PRODUCT_ORDER_ITEM_ID_");
        refProductOrderItemChar.setValueType("TEXT");
        refProductOrderItemChar.setValue(new Any( poi.getId() ));
        serviceRestriction.addServiceCharacteristicItem(refProductOrderItemChar);
        
        soi.setService(serviceRestriction);
        
      }
      

    }

    ServiceOrder externalSOrder = serviceOrderManager.createServiceOrder(servOrder);


    return externalSOrder;


  }
  
  
}
+29 −0
Original line number Diff line number Diff line
@@ -22,13 +22,18 @@ package org.etsi.osl.osom.management;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.etsi.osl.tmf.common.model.service.Characteristic;
import org.etsi.osl.tmf.common.model.service.Note;
import org.etsi.osl.tmf.common.model.service.ResourceRef;
import org.etsi.osl.tmf.common.model.service.ServiceRef;
import org.etsi.osl.tmf.common.model.service.ServiceStateType;
import org.etsi.osl.tmf.po622.model.ProductOrderStateType;
import org.etsi.osl.tmf.po622.model.ProductOrderUpdate;
import org.etsi.osl.tmf.ri639.model.Resource;
import org.etsi.osl.tmf.sim638.model.Service;
import org.etsi.osl.tmf.sim638.model.ServiceUpdate;
@@ -55,6 +60,9 @@ public class OrderCompleteService implements JavaDelegate {
    @Autowired
    private ServiceOrderManager serviceOrderManager;

    @Autowired
    private ProductOrderManager productOrderManager;
    

    @Autowired
    NFVOrchestrationCheckDeploymentService nfvOrchestrationCheckDeploymentService;
@@ -112,6 +120,7 @@ public class OrderCompleteService implements JavaDelegate {
			boolean existsInactiveInORder= false;
			boolean existsTerminatedInORder= false;
			//boolean updateServiceOrder= false;
			Map<String, Characteristic> productOrderIds = new HashMap<>();
			
			logger.info("ServiceOrder id:" + sOrder.getId());
			for (ServiceOrderItem soi : sOrder.getOrderItem()) {
@@ -192,6 +201,12 @@ public class OrderCompleteService implements JavaDelegate {
				allTerminatedItemsInOrder = allTerminatedItemsInOrder && soi.getState().equals( ServiceOrderStateType.COMPLETED );

				logger.info("ServiceOrderItem state:" + sserviceState.toString() );
				
				Characteristic prodOrderChar = soi.getService().findCharacteristicByName("_PRODUCT_ORDER_ID_");
				if ( prodOrderChar != null ) {
				  productOrderIds.put( prodOrderChar.getValue().getValue(), prodOrderChar);
				}
				
			}
			
			   
@@ -221,6 +236,20 @@ public class OrderCompleteService implements JavaDelegate {
				
				serviceOrderManager.updateServiceOrderOrder( sOrder.getId() , serviceOrderUpd);

				//pass the state to related product orders, if any
				for (String prodOredIds : productOrderIds.keySet()) {
				  ProductOrderUpdate productOrderUpd = new ProductOrderUpdate();
				  
				  if ( serviceOrderUpd.getState().equals( ServiceOrderStateType.COMPLETED ) ) {
				    productOrderUpd.setState( ProductOrderStateType.COMPLETED );
				  } else if ( serviceOrderUpd.getState().equals( ServiceOrderStateType.FAILED ) ) {
                    productOrderUpd.setState( ProductOrderStateType.FAILED );
                  }  
				  
				    
				  productOrderManager.updateProducteOrder(prodOredIds, productOrderUpd);
                }
				
			}
			
		}
+175 −0
Original line number Diff line number Diff line
package org.etsi.osl.osom.management;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.camel.ProducerTemplate;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.etsi.osl.tmf.pcm620.model.ProductOffering;
import org.etsi.osl.tmf.pcm620.model.ProductSpecification;
import org.etsi.osl.tmf.po622.model.ProductOrder;
import org.etsi.osl.tmf.po622.model.ProductOrderStateType;
import org.etsi.osl.tmf.po622.model.ProductOrderUpdate;
import org.etsi.osl.tmf.so641.model.ServiceOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import jakarta.validation.constraints.NotNull;

@Service
public class ProductOrderManager {


  private static final transient Log logger =
      LogFactory.getLog(ProductOrderManager.class.getName());


  @Autowired
  private ProducerTemplate template;

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

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


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


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


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

  public List<String> retrieveOrdersByState(ProductOrderStateType orderState) {
    logger.info("will retrieve Product Orders " + orderState.toString() + " from catalog ");
    try {
      Map<String, Object> map = new HashMap<>();
      map.put("orderstate", orderState.toString());
      Object response =
          template.requestBodyAndHeaders(CATALOG_GET_PRODUCTORDER_IDS_BY_STATE, "", map);

      logger.debug("will retrieve Service Orders " + orderState.toString()
          + " from catalog response: " + response.getClass());
      if (!(response instanceof String)) {
        logger.error("List  object is wrong.");
        return null;
      }
      // String[] sor = toJsonObj( (String)response, String[].class );

      ArrayList<String> sor = toJsonObj((String) response, ArrayList.class);
      logger.debug("retrieveOrdersByState response is: " + response);

      // return asList(sor);
      return sor;

    } catch (Exception e) {
      logger.error("Cannot retrieve Listof Product Orders " + orderState.toString()
          + " from catalog. " + e.toString());
    }
    return null;
  }

  public ProductOrder retrieveProductOrder(String orderid) {
    logger.info("will retrieve Product Order from catalog orderid=" + orderid);
    try {
      Object response = template.requestBody(CATALOG_GET_PRODUCTORDER_BY_ID, orderid);

      if (!(response instanceof String)) {
        logger.error("Product Order object is wrong.");
        return null;
      }
      logger.debug("retrieveProductOrder response is: " + response);
      ProductOrder sor = toJsonObj((String) response, ProductOrder.class);

      return sor;

    } catch (Exception e) {
      logger.error("Cannot retrieve Product Order details from catalog. " + e.toString());
    }
    return null;
  }



  public ProductSpecification retrieveProductSpec(@NotNull String id) {
    logger.info("will retrieve ProductSpecification from catalog orderid=" + id);
    try {
      Object response = template.requestBody(CATALOG_GET_PRODUCTSPEC_BY_ID, id);

      if (!(response instanceof String)) {
        logger.error("ProductSpecification object is wrong.");
        return null;
      }
      logger.debug("retrieveProductSpecification response is: " + response);
      ProductSpecification sor = toJsonObj((String) response, ProductSpecification.class);

      return sor;

    } catch (Exception e) {
      logger.error("Cannot retrieve ProductSpecification  details from catalog. " + e.toString());
    }
    return null;
  }

  public ProductOffering retrieveProductOffering(@NotNull String id) {
    logger.info("will retrieve ProductOffering from catalog orderid=" + id);
    try {
      Object response = template.requestBody(CATALOG_GET_PRODUCTOFFERING_BY_ID, id);

      if (!(response instanceof String)) {
        logger.error("ProductOffering object is wrong.");
        return null;
      }
      logger.debug("retrievProductOffering response is: " + response);
      ProductOffering sor = toJsonObj((String) response, ProductOffering.class);

      return sor;

    } catch (Exception e) {
      logger.error("Cannot retrieve ProductOffering details from catalog. " + 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);
  }

  public void updateProducteOrder(String orderid, ProductOrderUpdate productOrderUpd) {
    logger.info("will set Product Order in progress orderid=" + orderid);
    try {

      template.sendBodyAndHeader(CATALOG_UPD_PRODUCTORDER_BY_ID, toJsonString(productOrderUpd),
          "orderid", orderid);


    } catch (Exception e) {
      logger.error("Cannot set Product Order status from catalog. " + e.toString());
    }

  }


}
+13 −0
Original line number Diff line number Diff line
@@ -75,6 +75,19 @@ NFV_CATALOG_GET_NSD_BY_ID: "jms:queue:NFVCATALOG.GET.NSD_BY_ID"
NFV_CATALOG_UPD_DEPLOYMENT_BY_ID: "jms:queue:NFVCATALOG.UPD.DEPLOYMENT_BY_ID"
NFV_CATALOG_NS_DAY2_ACTION: "jms:queue:ns.action.run"

CATALOG_GET_PRODUCTSPEC_BY_ID: "jms:queue:CATALOG.GET.PRODUCTSPEC_BY_ID"
CATALOG_ADD_PRODUCTSPEC: "jms:queue:CATALOG.ADD.PRODUCTSPEC"
CATALOG_UPD_PRODUCTSPEC: "jms:queue:CATALOG.UPD.PRODUCTSPEC"
CATALOG_UPDADD_PRODUCTSPEC: "jms:queue:CATALOG.UPDADD.PRODUCTSPEC"
CATALOG_GET_PRODUCTOFFERING_BY_ID: "jms:queue:CATALOG.GET.PRODUCTOFFERING_BY_ID"

CATALOG_GET_PRODUCTORDERS: "jms:queue:CATALOG.GET.PRODUCTORDERS"
CATALOG_GET_PRODUCTORDER_BY_ID: "jms:queue:CATALOG.GET.PRODUCTORDER_BY_ID"
CATALOG_ADD_PRODUCTORDER: "jms:queue:CATALOG.ADD.PRODUCTORDER"
CATALOG_UPD_PRODUCTORDER_BY_ID: "jms:queue:CATALOG.UPD.PRODUCTORDER_BY_ID"
CATALOG_GET_INITIAL_PRODUCTORDERS_IDS: "jms:queue:CATALOG.GET.INITIAL_PRODUCTORDERS"
CATALOG_GET_PRODUCTORDER_IDS_BY_STATE: "jms:queue:CATALOG.GET.ACKNOWLEDGED_PRODUCTORDERS"

#NS ACTIONS
NFV_CATALOG_NSACTIONS_SCALE: "jms:queue:NSACTIONS.SCALE"

Loading