Loading src/main/java/org/etsi/osl/osom/management/FetchAcknowledgedProductOrders.java 0 → 100644 +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); } } src/main/java/org/etsi/osl/osom/management/InitializeProcessProductOrders.java 0 → 100644 +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; } } src/main/java/org/etsi/osl/osom/management/OrderCompleteService.java +29 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -55,6 +60,9 @@ public class OrderCompleteService implements JavaDelegate { @Autowired private ServiceOrderManager serviceOrderManager; @Autowired private ProductOrderManager productOrderManager; @Autowired NFVOrchestrationCheckDeploymentService nfvOrchestrationCheckDeploymentService; Loading Loading @@ -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()) { Loading Loading @@ -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); } } Loading Loading @@ -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); } } } Loading src/main/java/org/etsi/osl/osom/management/ProductOrderManager.java 0 → 100644 +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()); } } } src/main/resources/application.yml +13 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
src/main/java/org/etsi/osl/osom/management/FetchAcknowledgedProductOrders.java 0 → 100644 +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); } }
src/main/java/org/etsi/osl/osom/management/InitializeProcessProductOrders.java 0 → 100644 +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; } }
src/main/java/org/etsi/osl/osom/management/OrderCompleteService.java +29 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -55,6 +60,9 @@ public class OrderCompleteService implements JavaDelegate { @Autowired private ServiceOrderManager serviceOrderManager; @Autowired private ProductOrderManager productOrderManager; @Autowired NFVOrchestrationCheckDeploymentService nfvOrchestrationCheckDeploymentService; Loading Loading @@ -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()) { Loading Loading @@ -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); } } Loading Loading @@ -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); } } } Loading
src/main/java/org/etsi/osl/osom/management/ProductOrderManager.java 0 → 100644 +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()); } } }
src/main/resources/application.yml +13 −0 Original line number Diff line number Diff line Loading @@ -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