diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bb7d754baa751630b25598e182a30f062e9b6ebd..40be386b981d8564ef04539edebb44dc6a389d39 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -21,7 +21,7 @@ include: - ci-templates/default.yml - ci-templates/build.yml rules: - - if: '$CI_COMMIT_REF_PROTECTED && $CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "develop"' + - if: '$CI_COMMIT_REF_PROTECTED == "true" && $CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "develop"' - project: osl/code/org.etsi.osl.main ref: develop @@ -29,7 +29,7 @@ include: - ci-templates/default.yml - ci-templates/build_unprotected.yml rules: - - if: '$CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "develop" && !$CI_COMMIT_REF_PROTECTED' + - if: '$CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "develop" && $CI_COMMIT_REF_PROTECTED == "false"' maven_build: extends: .maven_build diff --git a/Dockerfile b/Dockerfile index 68aefbc7f20e13c9ec0b1d461e0b71382edd58af..4709a015efb079474cf8a24dcb980ecc2307b9c7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ FROM ibm-semeru-runtimes:open-17.0.7_7-jdk MAINTAINER openslice.io RUN mkdir /opt/shareclasses RUN mkdir -p /opt/openslice/lib/ -COPY target/org.etsi.osl.osom-1.0.0.jar /opt/openslice/lib/ -COPY target/org.etsi.osl.osom-1.0.0-exec.jar /opt/openslice/lib/ +COPY target/org.etsi.osl.osom-1.1.0.jar /opt/openslice/lib/ +COPY target/org.etsi.osl.osom-1.1.0-exec.jar /opt/openslice/lib/ COPY . /opt/openslice/lib/ -CMD ["java", "-Xshareclasses:cacheDir=/opt/shareclasses","-jar", "/opt/openslice/lib/org.etsi.osl.osom-1.0.0-exec.jar"] \ No newline at end of file +CMD ["java", "-Xshareclasses:cacheDir=/opt/shareclasses","-jar", "/opt/openslice/lib/org.etsi.osl.osom-1.1.0-exec.jar"] \ No newline at end of file diff --git a/pom.xml b/pom.xml index 9a6a469ef3b67959b07a1863ee7a726fc425c92e..ead5841d3b79af566cde234fa5265e28a20d59f7 100644 --- a/pom.xml +++ b/pom.xml @@ -5,16 +5,20 @@ <parent> <groupId>org.etsi.osl</groupId> <artifactId>org.etsi.osl.main</artifactId> - <version>1.0.0</version> + <version>2024Q4</version> <relativePath>../org.etsi.osl.main</relativePath> </parent> <artifactId>org.etsi.osl.osom</artifactId> <name>org.etsi.osl.osom</name> + <version>${org.etsi.osl.osom.version}</version> <url>http://maven.apache.org</url> - + <organization> + <name>OpenSlice by ETSI</name> + <url>https://osl.etsi.org</url> + </organization> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> @@ -82,6 +86,7 @@ <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> + <version>2.3.232</version> </dependency> <dependency> <groupId>org.etsi.osl</groupId> diff --git a/src/main/java/org/etsi/osl/osom/management/AutomationCheck.java b/src/main/java/org/etsi/osl/osom/management/AutomationCheck.java index d8aef5d75a29dd9ea47ed4ce1dbe2387f9579b1e..0f5d87517edb4f2d73a2487ab040f6d7e2ed75b0 100644 --- a/src/main/java/org/etsi/osl/osom/management/AutomationCheck.java +++ b/src/main/java/org/etsi/osl/osom/management/AutomationCheck.java @@ -88,8 +88,12 @@ public class AutomationCheck implements JavaDelegate { } else if ( spec.getType().equals("ResourceFacingServiceSpecification") && ( spec.findSpecCharacteristicByName( "OSM_NSDCATALOGID" ) != null ) ) { execution.setVariable("brokeActivity", "RFS_OSM" ); } else if ( spec.getType().equals("ResourceFacingServiceSpecification") && ( spec.findSpecCharacteristicByName( "_CR_SPEC" ) != null ) ) { - execution.setVariable("brokeActivity", "RFS_CRSPEC" ); - } + execution.setVariable("brokeActivity", "RFS_CRSPEC" ); + } else if ( spec.getType().equals("ResourceFacingServiceSpecification") && ( spec.findSpecCharacteristicByName( "_MT_QUERY" ) != null ) ) { + execution.setVariable("brokeActivity", "RFS_MTSPEC" ); + } else if ( spec.getType().equals("ResourceFacingServiceSpecification") ) { + execution.setVariable("brokeActivity", "GRSPEC" ); + } } diff --git a/src/main/java/org/etsi/osl/osom/management/CROrchestrationCheckDeploymentService.java b/src/main/java/org/etsi/osl/osom/management/CROrchestrationCheckDeploymentService.java index 8d036fe08f7360d1b018579af19d5c4de45e803a..b69a38910d5bb83ccd5e2242916faab9f6a98c43 100644 --- a/src/main/java/org/etsi/osl/osom/management/CROrchestrationCheckDeploymentService.java +++ b/src/main/java/org/etsi/osl/osom/management/CROrchestrationCheckDeploymentService.java @@ -91,13 +91,14 @@ public class CROrchestrationCheckDeploymentService implements JavaDelegate { Service serviceResult = serviceOrderManager.updateService( aService.getId(), supd, propagateToSO ); return; } + rlist.add(res); } @Valid ServiceStateType currentState = aService.getState(); - ServiceStateType nextState = aService.findNextStateBasedOnSupportingResources(rlist); + ServiceStateType nextState = aService.findNextStateBasedOnResourceList(rlist); if (!currentState.equals(nextState)) { supd.setState( nextState ); diff --git a/src/main/java/org/etsi/osl/osom/management/CROrchestrationService.java b/src/main/java/org/etsi/osl/osom/management/CROrchestrationService.java index 235012d76826f393907031bf5c2cf94a126f7f52..cff7c1eecd2da2634ea91d7e724d3d723cf95a9e 100644 --- a/src/main/java/org/etsi/osl/osom/management/CROrchestrationService.java +++ b/src/main/java/org/etsi/osl/osom/management/CROrchestrationService.java @@ -108,6 +108,15 @@ public class CROrchestrationService implements JavaDelegate { rr.setName( resourceCR.getName()); rr.setType( resourceCR.getType()); su.addSupportingResourceItem( rr ); + su.setState(ServiceStateType.RESERVED); + Note successNoteItem = new Note(); + successNoteItem.setText(String.format("Requesting CRIDGE to deploy crspec")); + successNoteItem.setDate(OffsetDateTime.now(ZoneOffset.UTC).toString()); + successNoteItem.setAuthor(compname); + su.addNoteItem(successNoteItem); + Service supd = serviceOrderManager.updateService(aService.getId(), su, false); + + String response = null; if (crspec != null) { @@ -120,22 +129,16 @@ public class CROrchestrationService implements JavaDelegate { servicecrspecLast.getValue().setValue( crspec ); su.addServiceCharacteristicItem(servicecrspecLast); - if ( response!=null && response.equals("OK")) { - su.setState(ServiceStateType.RESERVED); - Note successNoteItem = new Note(); - successNoteItem.setText(String.format("Requesting CRIDGE to deploy crspec")); - successNoteItem.setDate(OffsetDateTime.now(ZoneOffset.UTC).toString()); - successNoteItem.setAuthor(compname); - su.addNoteItem(successNoteItem); - } else { + if ( response==null || !response.equals("OK")) { + su = new ServiceUpdate(); su.setState(ServiceStateType.TERMINATED); Note errNoteItem = new Note(); errNoteItem.setText(String.format("Requesting CRIDGE to deploy crspec failed with message: " + response)); errNoteItem.setDate(OffsetDateTime.now(ZoneOffset.UTC).toString()); errNoteItem.setAuthor(compname); su.addNoteItem(errNoteItem); + supd = serviceOrderManager.updateService(aService.getId(), su, false); } - Service supd = serviceOrderManager.updateService(aService.getId(), su, false); return; diff --git a/src/main/java/org/etsi/osl/osom/management/CreateReservedService.java b/src/main/java/org/etsi/osl/osom/management/CreateReservedService.java index d545ff922ec40dafbf9358a270b0ff2eeee5538c..0609bd09b02d19f1490d9129120635795008a452 100644 --- a/src/main/java/org/etsi/osl/osom/management/CreateReservedService.java +++ b/src/main/java/org/etsi/osl/osom/management/CreateReservedService.java @@ -310,7 +310,7 @@ public class CreateReservedService implements JavaDelegate { if ( initCharValues != null ) { if ( initCharValues.get( c.getName() ) != null ) { Characteristic orderCharacteristic = new Characteristic() - .value( new Any( initCharValues.get( c.getName() ), initCharValues.get( c.getName() ))) ; + .value( new Any( initCharValues.get( c.getName() ), null ) ); serviceToCreate.addServiceCharacteristicItem( helperCreateCharacteristicItem(c, orderCharacteristic ) ); characteristicFound = true; continue; diff --git a/src/main/java/org/etsi/osl/osom/management/FetchAcknowledgedProductOrders.java b/src/main/java/org/etsi/osl/osom/management/FetchAcknowledgedProductOrders.java new file mode 100644 index 0000000000000000000000000000000000000000..b4241bac2aae328fd6caa8a05fa19bdf07e1cef0 --- /dev/null +++ b/src/main/java/org/etsi/osl/osom/management/FetchAcknowledgedProductOrders.java @@ -0,0 +1,97 @@ +/*- + * ========================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); + + + + } +} diff --git a/src/main/java/org/etsi/osl/osom/management/GCOrchestrationCheckDeploymentService.java b/src/main/java/org/etsi/osl/osom/management/GCOrchestrationCheckDeploymentService.java new file mode 100644 index 0000000000000000000000000000000000000000..8f1e4d0c724a72045491d9d141d35bf8723c5156 --- /dev/null +++ b/src/main/java/org/etsi/osl/osom/management/GCOrchestrationCheckDeploymentService.java @@ -0,0 +1,130 @@ +/*- + * ========================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.OffsetDateTime; +import java.time.ZoneOffset; +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.service.Note; +import org.etsi.osl.tmf.common.model.service.ResourceRef; +import org.etsi.osl.tmf.common.model.service.ServiceStateType; +import org.etsi.osl.tmf.ri639.model.Resource; +import org.etsi.osl.tmf.sim638.model.Service; +import org.etsi.osl.tmf.sim638.model.ServiceUpdate; +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 = "gcOrchestrationCheckDeploymentService") //bean name +public class GCOrchestrationCheckDeploymentService implements JavaDelegate { + + private static final transient Log logger = LogFactory.getLog(GCOrchestrationCheckDeploymentService.class.getName()); + + + + @Value("${spring.application.name}") + private String compname; + + @Autowired + private ServiceOrderManager serviceOrderManager; + + public void execute(DelegateExecution execution) { + + logger.info( "CROrchestrationCheckDeploymentService" ); + logger.info( execution.getVariableNames().toString() ); + + + if ( execution.getVariable("contextServiceId") == null) { + + logger.error( "Variable contextServiceId is NULL!" ); + execution.setVariable("serviceDeploymentFinished", Boolean.TRUE ); + return; + } + Service aService = serviceOrderManager.retrieveService( (String) execution.getVariable("contextServiceId") ); + + if ( aService == null ) { + logger.info( "aService is null for contextServiceId = " +(String) execution.getVariable("contextServiceId") ); + execution.setVariable("serviceDeploymentFinished", Boolean.TRUE ); + return; + } + + execution.setVariable("serviceDeploymentFinished", Boolean.FALSE ); + + ServiceUpdate supd = new ServiceUpdate(); + boolean propagateToSO = false; + + //retrieve the related supporting resource by id and check its status + //ResourceRef supresourceRef = aService.getSupportingResource().stream().findFirst().get();//we assume for now we have only one related resource + + List<Resource> rlist = new ArrayList<Resource>(); + for (ResourceRef rref : aService.getSupportingResource()) { + Resource res = serviceOrderManager.retrieveResource(rref.getId()); + + if ( res == null ) { + supd.setState( ServiceStateType.TERMINATED); + execution.setVariable("serviceDeploymentFinished", Boolean.TRUE); + Service serviceResult = serviceOrderManager.updateService( aService.getId(), supd, propagateToSO ); + return; + } + rlist.add(res); + + } + @Valid + ServiceStateType currentState = aService.getState(); + + ServiceStateType nextState = aService.findNextStateBasedOnResourceList(rlist); + + if (!currentState.equals(nextState)) { + supd.setState( nextState ); + Note n = new Note(); + n.setText("Service Status Changed to: " + nextState); + n.setAuthor(compname); + n.setDate(OffsetDateTime.now(ZoneOffset.UTC).toString()); + supd.addNoteItem(n); + aService = serviceOrderManager.updateService( aService.getId(), supd, propagateToSO ); + } + + if ( aService!= null ) { + if ( aService.getState().equals(ServiceStateType.ACTIVE) + || aService.getState().equals(ServiceStateType.TERMINATED)) { + + logger.info("Deployment Status OK. Service state = " + aService.getState() ); + execution.setVariable("serviceDeploymentFinished", Boolean.TRUE); + return; + } + } + logger.info("Wait For Deployment Status. "); + + + + + + } + + + +} diff --git a/src/main/java/org/etsi/osl/osom/management/GCOrchestrationService.java b/src/main/java/org/etsi/osl/osom/management/GCOrchestrationService.java new file mode 100644 index 0000000000000000000000000000000000000000..a7e0deadfae41bb956259e83d40bea8bce299b9e --- /dev/null +++ b/src/main/java/org/etsi/osl/osom/management/GCOrchestrationService.java @@ -0,0 +1,397 @@ +/*- + * ========================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.OffsetDateTime; +import java.time.ZoneOffset; +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.Any; +import org.etsi.osl.tmf.common.model.EValueType; +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.ServiceStateType; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecification; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationCharacteristic; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationCharacteristicValue; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationRef; +import org.etsi.osl.tmf.ri639.model.Resource; +import org.etsi.osl.tmf.ri639.model.ResourceCreate; +import org.etsi.osl.tmf.scm633.model.ServiceSpecCharacteristic; +import org.etsi.osl.tmf.scm633.model.ServiceSpecification; +import org.etsi.osl.tmf.sim638.model.Service; +import org.etsi.osl.tmf.sim638.model.ServiceUpdate; +import org.etsi.osl.tmf.so641.model.ServiceOrder; +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 = "gcOrchestrationService") // bean name +public class GCOrchestrationService implements JavaDelegate { + + private static final transient Log logger = + LogFactory.getLog(GCOrchestrationService.class.getName()); + + + @Value("${spring.application.name}") + private String compname; + + + @Autowired + private ServiceOrderManager serviceOrderManager; + + + public void execute(DelegateExecution execution) { + + logger.debug("Ceneric Controller OrchestrationService"); + logger.debug("VariableNames:" + execution.getVariableNames().toString()); + logger.debug("orderid:" + execution.getVariable("orderid").toString()); + logger.debug("contextServiceId:" + execution.getVariable("contextServiceId").toString()); + + try { + + + ServiceUpdate su = new ServiceUpdate();// the object to update the service + Note noteItem = new Note(); + noteItem.setText(""); + + if (execution.getVariable("contextServiceId") instanceof String contextServiceId) { + + + + ServiceOrder sorder = + serviceOrderManager.retrieveServiceOrder(execution.getVariable("orderid").toString()); + Service aService = + serviceOrderManager.retrieveService( contextServiceId ); + logger.info("Service name:" + aService.getName()); + logger.info("Service state:" + aService.getState()); + logger.info("Request for a Custom Resource creation for Service: " + aService.getId()); + + // we need to retrieve here the Service Spec of this service + + ServiceSpecification spec = + serviceOrderManager.retrieveServiceSpec(aService.getServiceSpecificationRef().getId()); + + if (spec != null) { + + + + + //we need to get the equivalent resource spec. since ServiceSpec is an RFS + ResourceSpecificationRef rSpecRef = spec.getResourceSpecification().stream().findFirst().get(); + + ResourceSpecification rspec = serviceOrderManager.retrieveResourceSpec(rSpecRef.getId()); + + //we will create a resource based on the values of resourcepsecificationRef + ResourceCreate resourceCreate = createRelatedResource( rspec, sorder, aService ); + + + //save it to TMF API service inventory + Resource resourceI = serviceOrderManager.createResource( resourceCreate, sorder, rspec.getId() ); + + + ResourceRef rr = new ResourceRef(); + rr.setId( resourceI.getId() ); + rr.setName( resourceI.getName()); + rr.setType( resourceI.getType()); + su.addSupportingResourceItem( rr ); + + su.setState(ServiceStateType.RESERVED); + Note successNoteItem = new Note(); + successNoteItem.setText(String.format("Requesting Controller of "+ rSpecRef.getName() +" to deploy resource")); + successNoteItem.setDate(OffsetDateTime.now(ZoneOffset.UTC).toString()); + successNoteItem.setAuthor(compname); + su.addNoteItem(successNoteItem); + Service supd = serviceOrderManager.updateService(aService.getId(), su, false); + + Resource response = null; + + response = createNewResourceDeploymentRequest(aService, resourceI, resourceCreate, sorder.getId() ); + + + + if ( response==null ) { + su.setState(ServiceStateType.TERMINATED); + Note errNoteItem = new Note(); + errNoteItem.setText(String.format("Requesting Controller to deploy resource failed ")); + errNoteItem.setDate(OffsetDateTime.now(ZoneOffset.UTC).toString()); + errNoteItem.setAuthor(compname); + su.addNoteItem(errNoteItem); + supd = serviceOrderManager.updateService(aService.getId(), su, false); + } + + return; + + } else { + + logger.error("Cannot retrieve ServiceSpecification for service :" + + (String) execution.getVariable("contextServiceId")); + } + } else { + logger.error("Cannot retrieve variable contextServiceId"); + } + + // if we get here something is wrong so we need to terminate the service. + + + + }catch (Exception e) { + e.printStackTrace(); + } + + + try { + Note noteItem = new Note(); + noteItem.setText("Request to CR FAILED." + noteItem.getText()); + noteItem.setAuthor(compname); + noteItem.setDate(OffsetDateTime.now(ZoneOffset.UTC).toString()); + ServiceUpdate su = new ServiceUpdate();// the object to update the service + su.addNoteItem(noteItem); + su.setState(ServiceStateType.TERMINATED); + serviceOrderManager.updateService(execution.getVariable("contextServiceId").toString(), su, + false); + }catch (Exception e) { + e.printStackTrace(); + } + + } + + + /** + * + * THe resource has a temporary name. + * later on the name and its characteristics are updated via the generic controller + * + * + * @param rSpecRef + * @param sOrder + * @param aService + * @return + */ + private ResourceCreate createRelatedResource(ResourceSpecification rspec, ServiceOrder sOrder, Service aService) { + + /** + * In future releases, it is better to create some helper function in the TMF model that + * Creates a resource from a resource specification, (or a service from a servic spec). + * There are similar functions in other places, so it is better to move them in one place + */ + ResourceCreate resCreate = new ResourceCreate(); + resCreate.setName( rspec.getName()+"-" + aService.getId() ); + resCreate.setCategory( rspec.getCategory() ); + resCreate.resourceVersion( rspec.getVersion() ); + + resCreate.setStartOperatingDate( aService.getStartDate() ); + resCreate.setEndOperatingDate(aService.getEndDate()); + ResourceSpecificationRef rSpecRefObj = new ResourceSpecificationRef() ; + rSpecRefObj.id(rspec.getId()) + .version(rspec.getVersion()) + .name( rspec.getName()) + .setType(rspec.getType()); + resCreate.setResourceSpecification(rSpecRefObj); + + + for (ResourceSpecificationCharacteristic c : rspec.getResourceSpecCharacteristic()) { + for (Characteristic orderCharacteristic : aService.getServiceCharacteristic() ) { + String specCharacteristicToSearch = c.getName(); + if ( orderCharacteristic.getName().equals( specCharacteristicToSearch )) { //copy only characteristics that are related from the order + + resCreate.addResourceCharacteristicItem( addResourceCharacteristicItem(c, orderCharacteristic) ); + break; + } + } + } + + //copy to resource the rest of the characteristics that do not exists yet from the above search + resCreate = copyRemainingSpecCharacteristicsToResourceCharacteristic(rspec , resCreate ); + + return resCreate; + + + + } + + + private org.etsi.osl.tmf.ri639.model.Characteristic addResourceCharacteristicItem(ResourceSpecificationCharacteristic c, Characteristic orderCharacteristic) { + org.etsi.osl.tmf.ri639.model.Characteristic resCharacteristicItem = new org.etsi.osl.tmf.ri639.model.Characteristic(); + resCharacteristicItem.setName( c.getName() ); + resCharacteristicItem.setValueType( c.getValueType() ); + + Any val = new Any(); + val.setValue( orderCharacteristic.getValue().getValue() ); + val.setAlias( orderCharacteristic.getValue().getAlias() ); + + resCharacteristicItem.setValue( val ); + + return resCharacteristicItem; + } + + + /** + * + * This helper function it is better in future to be moved in the TMF model. + * There is similar in resource order + * + * @param spec + * @param list + */ + private ResourceCreate copyRemainingSpecCharacteristicsToResourceCharacteristic(ResourceSpecification spec, + @Valid ResourceCreate resCreate) { + + List<org.etsi.osl.tmf.ri639.model.Characteristic> list = resCreate.getResourceCharacteristic(); + + for (ResourceSpecificationCharacteristic sourceCharacteristic : spec.getResourceSpecCharacteristic()) { + if ( sourceCharacteristic.getValueType() != null ) { + boolean charfound = false; + for (org.etsi.osl.tmf.ri639.model.Characteristic destchar : list) { + if ( destchar.getName().equals(sourceCharacteristic.getName())) { + charfound = true; + break; + } + } + + if (!charfound) { + + org.etsi.osl.tmf.ri639.model.Characteristic newChar = new org.etsi.osl.tmf.ri639.model.Characteristic(); + newChar.setName( sourceCharacteristic.getName() ); + newChar.setValueType( sourceCharacteristic.getValueType() ); + + if ( sourceCharacteristic.getValueType() != null && sourceCharacteristic.getValueType().equals( EValueType.ARRAY.getValue() ) || + sourceCharacteristic.getValueType() != null && sourceCharacteristic.getValueType().equals( EValueType.SET.getValue() ) ) { + String valString = ""; + for (ResourceSpecificationCharacteristicValue specchar : sourceCharacteristic.getResourceSpecCharacteristicValue()) { + if ( ( specchar.isIsDefault()!= null) && specchar.isIsDefault() ) { + if ( !valString.equals("")) { + valString = valString + ","; + } + valString = valString + "{\"value\":\"" + specchar.getValue().getValue() + "\",\"alias\":\"" + specchar.getValue().getAlias() + "\"}"; + } + + } + + newChar.setValue( new Any( "[" + valString + "]", "") ); + + + } else { + for (ResourceSpecificationCharacteristicValue specchar : sourceCharacteristic.getResourceSpecCharacteristicValue()) { + if ( ( specchar.isIsDefault()!= null) && specchar.isIsDefault() ) { + newChar.setValue( new Any( + specchar.getValue().getValue(), + specchar.getValue().getAlias()) ); + break; + }else { + if (specchar.isIsDefault()== null){ + + logger.info("specchar is null value: " + sourceCharacteristic.getName() ); + } + } + + } + } + + + if ( newChar.getValue() !=null) { + list.add(newChar ); + } else { + newChar.setValue( new Any( + "", + "") ); + list.add(newChar ); + } + + } + + } + + + } + + return resCreate; + + } + + + /** + * + * This function makes a new deployment resource request for a resource specification. + * The request is performed via the message queue. + * The function sends also some headers that maybe are needed for deployment + * These are the headers + * <br> + * <br><b>org.etsi.osl.serviceId:</b> This is the related service id that the created resource has a reference + * <br><b>org.etsi.osl.resourceId:</b> This is the related resource id that the created CR will wrap and reference. There + * <br><b>org.etsi.osl.prefixName:</b> we need to add a short prefix (default is cr) to various places. For example in K8s cannot start with a number + * <br><b>org.etsi.osl.serviceOrderId:</b> the related service order id of this deployment request + * <br> + * + * @param aService reference to the service that the resource and the CR belongs to + * @param resourceI reference the equivalent resource in TMF repo of the target CR. One to one mapping + * @param orderId related service order ID + * @return a Resource as updated. It might return "OK" if everything is ok. + * "SEE OTHER" if there are multiple CRIDGEs then some other cridge will handle the request for the equivalent cluster. + * Any other response is handled as error + * return Resource object from the controller + */ + private Resource createNewResourceDeploymentRequest( Service aService, Resource resourceI, + ResourceCreate aResourceCreate, + String orderId) { + + try { + Map<String, Object> map = new HashMap<>(); + map.put("org.etsi.osl.serviceId", aService.getId() ); + map.put("org.etsi.osl.resourceId", resourceI.getId() ); + map.put("org.etsi.osl.prefixName", "gr" + resourceI.getId().substring(0, 8) ); + map.put("org.etsi.osl.serviceOrderId", orderId ); + + + logger.debug("createNewResourceDeploymentRequest "); + + String queueName = "jms:queue:CREATE/"+ aResourceCreate.getCategory() + "/" + aResourceCreate.getResourceVersion() ; + Resource response = serviceOrderManager.gcGenericResourceDeploymentRequest(queueName , map, aResourceCreate); + + + return response; + + } catch (Exception e) { + logger.error("cridgeDeploymentRequest failed"); + e.printStackTrace(); + } + + return null; + + } + + + private Object getServiceCharacteristic(Service aService, String val) { + if (aService.getServiceCharacteristicByName( val ) !=null ) { + return aService.getServiceCharacteristicByName( val ).getValue().getValue(); + } + return ""; + } + + +} diff --git a/src/main/java/org/etsi/osl/osom/management/InitializeProcessProductOrders.java b/src/main/java/org/etsi/osl/osom/management/InitializeProcessProductOrders.java new file mode 100644 index 0000000000000000000000000000000000000000..03ffa418c376f5c6052b5302dba6fe3c97bb0afe --- /dev/null +++ b/src/main/java/org/etsi/osl/osom/management/InitializeProcessProductOrders.java @@ -0,0 +1,220 @@ +/*- + * ========================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; + + + } + + +} diff --git a/src/main/java/org/etsi/osl/osom/management/MetricoOrchestrationCheckDeploymentService.java b/src/main/java/org/etsi/osl/osom/management/MetricoOrchestrationCheckDeploymentService.java new file mode 100644 index 0000000000000000000000000000000000000000..8809c08d663d564d9efca7ae97eb55250cf0f91b --- /dev/null +++ b/src/main/java/org/etsi/osl/osom/management/MetricoOrchestrationCheckDeploymentService.java @@ -0,0 +1,95 @@ +package org.etsi.osl.osom.management; + +import jakarta.validation.Valid; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +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.ServiceStateType; +import org.etsi.osl.tmf.ri639.model.Resource; +import org.etsi.osl.tmf.sim638.model.Service; +import org.etsi.osl.tmf.sim638.model.ServiceUpdate; +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 java.time.OffsetDateTime; +import java.time.ZoneOffset; +import java.util.ArrayList; +import java.util.List; + +@Component(value = "metricoOrchestrationCheckDeploymentService") +public class MetricoOrchestrationCheckDeploymentService implements JavaDelegate { + private static final transient Log logger = LogFactory.getLog(MetricoOrchestrationCheckDeploymentService.class.getName()); + + @Autowired + private ServiceOrderManager serviceOrderManager; + + + @Value("${spring.application.name}") + private String compname; + + @Override + public void execute(DelegateExecution execution) { + + logger.info( "MetricoOrchestrationCheckDeploymentService" ); + logger.info( execution.getVariableNames().toString() ); + + if ( execution.getVariable("contextServiceId") == null) { + + logger.error( "Variable contextServiceId is NULL!" ); + execution.setVariable("serviceDeploymentFinished", Boolean.TRUE ); + return; + } + Service aService = serviceOrderManager.retrieveService( (String) execution.getVariable("contextServiceId") ); + + if ( aService == null ) { + logger.info( "aService is null for contextServiceId = " +(String) execution.getVariable("contextServiceId") ); + execution.setVariable("serviceDeploymentFinished", Boolean.TRUE ); + return; + } + + execution.setVariable("serviceDeploymentFinished", Boolean.FALSE ); + ServiceUpdate supd = new ServiceUpdate(); + boolean propagateToSO = false; + + List<Resource> rlist = new ArrayList<Resource>(); + for (ResourceRef rref : aService.getSupportingResource()) { + Resource res = serviceOrderManager.retrieveResource(rref.getId()); + + if ( res == null ) { + supd.setState( ServiceStateType.TERMINATED); + execution.setVariable("serviceDeploymentFinished", Boolean.TRUE); + Service serviceResult = serviceOrderManager.updateService( aService.getId(), supd, propagateToSO ); + return; + } + rlist.add(res); + } + @Valid + ServiceStateType currentState = aService.getState(); + ServiceStateType nextState = aService.findNextStateBasedOnResourceList(rlist); + + if (!currentState.equals(nextState)) { + supd.setState( nextState ); + Note n = new Note(); + n.setText("Service Status Changed to: " + nextState); + n.setAuthor(compname); + n.setDate(OffsetDateTime.now(ZoneOffset.UTC).toString()); + supd.addNoteItem(n); + aService = serviceOrderManager.updateService( aService.getId(), supd, propagateToSO ); + } + + if ( aService!= null ) { + if ( aService.getState().equals(ServiceStateType.ACTIVE) + || aService.getState().equals(ServiceStateType.TERMINATED)) { + + logger.info("Deployment Status OK. Service state = " + aService.getState() ); + execution.setVariable("serviceDeploymentFinished", Boolean.TRUE); + return; + } + } + logger.info("Wait For Deployment Status. "); + } +} diff --git a/src/main/java/org/etsi/osl/osom/management/MetricoOrchestrationService.java b/src/main/java/org/etsi/osl/osom/management/MetricoOrchestrationService.java new file mode 100644 index 0000000000000000000000000000000000000000..d2ee32a5c4218e3b0723796d2272ce9622702d61 --- /dev/null +++ b/src/main/java/org/etsi/osl/osom/management/MetricoOrchestrationService.java @@ -0,0 +1,277 @@ +package org.etsi.osl.osom.management; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonProcessingException; +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.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.ServiceStateType; +import org.etsi.osl.tmf.common.model.Any; +import org.etsi.osl.tmf.pm628.model.*; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationRef; +import org.etsi.osl.tmf.ri639.model.Resource; +import org.etsi.osl.tmf.ri639.model.ResourceCreate; +import org.etsi.osl.tmf.ri639.model.ResourceStatusType; +import org.etsi.osl.tmf.scm633.model.ServiceSpecification; +import org.etsi.osl.tmf.sim638.model.Service; +import org.etsi.osl.tmf.sim638.model.ServiceUpdate; +import org.etsi.osl.tmf.so641.model.ServiceOrder; +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.format.annotation.DateTimeFormat; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.time.OffsetDateTime; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.ArrayList; +import java.util.List; + +@Component(value = "metricoOrchestrationService") //bean name +public class MetricoOrchestrationService implements JavaDelegate { + + private static final transient Log logger = LogFactory.getLog(MetricoOrchestrationService.class.getName()); + + + + @Value("${spring.application.name}") + private String compname; + + + @Autowired + private ServiceOrderManager serviceOrderManager; + + + @Override + public void execute(DelegateExecution execution) { + ServiceOrder sorder = serviceOrderManager.retrieveServiceOrder(execution.getVariable("orderid").toString()); + ServiceUpdate su = new ServiceUpdate();// the object to update the service + Service aService = serviceOrderManager.retrieveService((String) execution.getVariable("contextServiceId")); + logger.info("Service name:" + aService.getName()); + logger.info("Service state:" + aService.getState()); + logger.info("Request to TMF628 for Service: " + aService.getId()); + + + ServiceSpecification spec = serviceOrderManager.retrieveServiceSpec(aService.getServiceSpecificationRef().getId()); + + if (spec != null) { + + Characteristic serviceCharacteristic; + MeasurementCollectionJobFVO mcjFVO = new MeasurementCollectionJobFVO(); + mcjFVO.setCreationTime( OffsetDateTime.now()); + mcjFVO.setLastModifiedTime( OffsetDateTime.now()); + + mcjFVO.setProducingApplicationId(aService.getId()); + + serviceCharacteristic = aService.getServiceCharacteristicByName("_MT_CHARACTERISTIC_NAME"); + String characteristicName = String.valueOf(serviceCharacteristic.getValue().getValue()); + mcjFVO.setOutputFormat(characteristicName); + + serviceCharacteristic = aService.getServiceCharacteristicByName("_MT_SERVICEUUID"); + String cfs_id = String.valueOf(serviceCharacteristic.getValue().getValue()); + mcjFVO.setConsumingApplicationId(cfs_id); + + serviceCharacteristic = aService.getServiceCharacteristicByName("_MT_END_TIME"); + String endTimeString = String.valueOf(serviceCharacteristic.getValue().getValue()); + ScheduleDefinitionFVO scheduleDefinition = new ScheduleDefinitionFVO(); + if (endTimeString != null && !endTimeString.equals("")) { + OffsetDateTime endTime = convertStringToOffsetDateTime(endTimeString, DateTimeFormat.ISO.DATE_TIME ); + scheduleDefinition.setScheduleDefinitionEndTime(endTime); + } else{ + OffsetDateTime endTime = OffsetDateTime.now().plusHours(1); + scheduleDefinition.setScheduleDefinitionEndTime(endTime); + } + + serviceCharacteristic = aService.getServiceCharacteristicByName("_MT_START_TIME"); + String startTimeString = String.valueOf(serviceCharacteristic.getValue().getValue()); + if (startTimeString != null&& !startTimeString.equals("")) { + OffsetDateTime startTime = convertStringToOffsetDateTime(startTimeString, DateTimeFormat.ISO.DATE_TIME ); + scheduleDefinition.setScheduleDefinitionStartTime(startTime); + } else{ + OffsetDateTime startTime = OffsetDateTime.now(); + scheduleDefinition.setScheduleDefinitionStartTime(startTime); + } + List<ScheduleDefinitionFVO> scheduleDefinitions = new ArrayList<>(); + scheduleDefinitions.add(scheduleDefinition); + mcjFVO.setScheduleDefinition(scheduleDefinitions); + + serviceCharacteristic = aService.getServiceCharacteristicByName("_MT_RECURRING_INTERVAL"); + String recurringIntervalString = String.valueOf(serviceCharacteristic.getValue().getValue()); + if (recurringIntervalString != null) { + if (Granularity.contains(recurringIntervalString)){ + Granularity recurringInterval = Granularity.valueOf(recurringIntervalString.toUpperCase()); + mcjFVO.setGranularity(recurringInterval); + } else { + logger.error("Invalid _MT_RECURRING_INTERVAL value. Valid values are:" + Granularity.getPossibleValues() + " It will be set to 1 minute."); + Granularity recurringInterval = Granularity.G_1MN; + mcjFVO.setGranularity(recurringInterval); + } + } else { + Granularity recurringInterval = Granularity.G_1MN; + mcjFVO.setGranularity(recurringInterval); + } + + serviceCharacteristic = aService.getServiceCharacteristicByName("_MT_TYPE"); + String monitoringType = String.valueOf(serviceCharacteristic.getValue().getValue()); + DataAccessEndpointFVO dataAccessEndpoint = new DataAccessEndpointFVO(); + dataAccessEndpoint.setApiType(monitoringType); + + serviceCharacteristic = aService.getServiceCharacteristicByName("_MT_QUERY"); + String monitoringQuery = String.valueOf(serviceCharacteristic.getValue().getValue()); + serviceCharacteristic = aService.getServiceCharacteristicByName("_MT_URL"); + String monitoringURL = String.valueOf(serviceCharacteristic.getValue().getValue()); + try { + URI monitoringURI = createUri(monitoringURL, monitoringQuery); + dataAccessEndpoint.setUri(monitoringURI); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + + List<DataAccessEndpointFVO> dataAccessEndpoints = new ArrayList<>(); + dataAccessEndpoints.add(dataAccessEndpoint); + mcjFVO.setDataAccessEndpoint(dataAccessEndpoints); + + ResourceSpecificationRef resourceSpecificationRef = spec.getResourceSpecification().stream().findFirst().get(); + Resource resourceMT = createRelatedResource( resourceSpecificationRef, sorder, aService ); + ResourceRef resourceRef = new ResourceRef(); + + resourceRef.setId( resourceMT.getId() ); + resourceRef.setName( resourceMT.getName()); + resourceRef.setType( resourceMT.getType()); + su.addSupportingResourceItem( resourceRef ); + su.setState(ServiceStateType.RESERVED); + Note successNoteItem = new Note(); + successNoteItem.setText(String.format("Requesting METRICO to create a new monitoring job")); + successNoteItem.setDate(OffsetDateTime.now(ZoneOffset.UTC).toString()); + successNoteItem.setAuthor(compname); + su.addNoteItem(successNoteItem); + + Service supd = serviceOrderManager.updateService(aService.getId(), su, false);//we nned first to create this in the db + + su = new ServiceUpdate();// the object to update the service + MeasurementCollectionJob mcj = serviceOrderManager.addMeasurementCollectionJob(mcjFVO); + if (mcj != null){ + logger.info("Measurement Collection Job was not created."); + + serviceCharacteristic = new Characteristic(); + serviceCharacteristic.setName( "_MT_MCJ_REFID" ); + serviceCharacteristic.setValueType( "TEXT" ); + Any val = new Any(); + val.setValue( mcj.getUuid() ); + val.setAlias( "" ); + serviceCharacteristic.setValue(val); + su.addServiceCharacteristicItem(serviceCharacteristic); + + } else { + logger.error("Measurement Collection Job was not created."); + su.setState(ServiceStateType.TERMINATED); + } + + supd = serviceOrderManager.updateService(aService.getId(), su, false);//we nned first to create this in the db + + + } + } + + + + + +// Methods created to use in this class + public static OffsetDateTime convertStringToOffsetDateTime(String dateTimeString, DateTimeFormat.ISO pattern) { + DateTimeFormatter formatter; + switch (pattern) { + case DATE: + formatter = DateTimeFormatter.ISO_DATE; + break; + case TIME: + formatter = DateTimeFormatter.ISO_TIME; + break; + case DATE_TIME: + formatter = DateTimeFormatter.ISO_DATE_TIME; + break; + default: + throw new IllegalArgumentException("Unsupported DateTimeFormat.ISO pattern"); + } + try { + OffsetDateTime.parse(dateTimeString, formatter); + return OffsetDateTime.parse(dateTimeString, formatter); + } catch (DateTimeParseException e) { + logger.error(e.getMessage()); + return null; + } + + } + + public static URI createUri(String url, String query) throws URISyntaxException { + return new URI(url + "?" + query); + } + + public 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); + } + + public static <T> String toJsonString(T object) { + ObjectMapper mapper = new ObjectMapper(); + mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + try { + return mapper.writeValueAsString(object); + } catch (JsonProcessingException e) { + e.printStackTrace(); + return null; + } + } + + + + /** + * + * The resource maps the created MCJ + * @param rSpecRef + * @param sOrder + * @param aService + * @return + */ + private Resource createRelatedResource(ResourceSpecificationRef rSpecRef, ServiceOrder sOrder, Service aService) { + + ResourceCreate resCreate = new ResourceCreate(); + resCreate.setName( rSpecRef.getName() + "-" + aService.getId() ); + resCreate.setStartOperatingDate( aService.getStartDate() ); + resCreate.setEndOperatingDate(aService.getEndDate()); + resCreate.setResourceStatus (ResourceStatusType.RESERVED); + + ResourceSpecificationRef rSpecRefObj = new ResourceSpecificationRef() ; + rSpecRefObj.id(rSpecRef.getId()) + .name( rSpecRef.getName()) + .setType(rSpecRef.getType()); + resCreate.setResourceSpecification(rSpecRefObj); + + org.etsi.osl.tmf.ri639.model.Characteristic resCharacteristicItem = new org.etsi.osl.tmf.ri639.model.Characteristic(); + resCharacteristicItem.setName( "_MT_MCJ_REF" ); + resCharacteristicItem.setValueType( "TEXT" ); + Any val = new Any(); + val.setValue( "PENDING" ); + val.setAlias( "PENDING" ); + resCharacteristicItem.setValue( val ); + resCreate.addResourceCharacteristicItem( resCharacteristicItem ); + + + // 1) need to copy the characteristics of the Resource Specification (use this instead of @param rSpecRef) and populate them with value from the aService (see GCOrchestrationService) + // 2) also need to populate the characteristic _MT_MCJ_REF with the UUID of the created MCJ / pass it as @param mcj + + return serviceOrderManager.createResource( resCreate, sOrder, rSpecRef.getId() ); + } + +} diff --git a/src/main/java/org/etsi/osl/osom/management/OrderCompleteService.java b/src/main/java/org/etsi/osl/osom/management/OrderCompleteService.java index 8f39cd0e6f790b6032eb4d02cbfded1f29068246..039f7ae306c04d82f4e920d251061e2199d4f24c 100644 --- a/src/main/java/org/etsi/osl/osom/management/OrderCompleteService.java +++ b/src/main/java/org/etsi/osl/osom/management/OrderCompleteService.java @@ -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; @@ -54,6 +59,9 @@ public class OrderCompleteService implements JavaDelegate { @Autowired private ServiceOrderManager serviceOrderManager; + + @Autowired + private ProductOrderManager productOrderManager; @Autowired @@ -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); + } + } } diff --git a/src/main/java/org/etsi/osl/osom/management/ProcessCreateServiceRules.java b/src/main/java/org/etsi/osl/osom/management/ProcessCreateServiceRules.java index 8aa8166bf849b3dfeea36ce6db582bbb4aad9f81..6ca1a256c557b4bc19637f9722944796432b1749 100644 --- a/src/main/java/org/etsi/osl/osom/management/ProcessCreateServiceRules.java +++ b/src/main/java/org/etsi/osl/osom/management/ProcessCreateServiceRules.java @@ -67,6 +67,11 @@ public class ProcessCreateServiceRules implements JavaDelegate { return; } + if ( spec == null) { + logger.debug("\tCannot retrieve ServiceSpec:" + contextServiceSpecId); + return; + } + /* * first find all referenced ServiceSpecs of a ServiceSpec to be created diff --git a/src/main/java/org/etsi/osl/osom/management/ProcessOrderItemActionCheck.java b/src/main/java/org/etsi/osl/osom/management/ProcessOrderItemActionCheck.java index 0b49e90173acc5353e5921f14aa6755a6472dc65..1addb48ebd457d2491c14dd30be0ed6e487497d9 100644 --- a/src/main/java/org/etsi/osl/osom/management/ProcessOrderItemActionCheck.java +++ b/src/main/java/org/etsi/osl/osom/management/ProcessOrderItemActionCheck.java @@ -34,6 +34,7 @@ public class ProcessOrderItemActionCheck implements JavaDelegate { ServiceOrder sor = serviceOrderManager.retrieveServiceOrder((String) execution.getVariable("orderid")); String orderItemIdToProcess = (String) execution.getVariable("orderItemId"); ServiceOrderItem soi = null; + execution.setVariable("saction", "NONE"); for (ServiceOrderItem i : sor.getOrderItem()) { if (i.getUuid().equals( orderItemIdToProcess )){ @@ -46,7 +47,6 @@ public class ProcessOrderItemActionCheck implements JavaDelegate { logger.error("In ProcessOrderItemActionCheck cannot find ServiceOrderItem orderItemIdToProcess=:" + orderItemIdToProcess); logger.error("In ProcessOrderItemActionCheck cannot find ServiceOrderItem sor.getUuid()=:" + sor.getUuid() ); logger.error("In ProcessOrderItemActionCheck cannot find ServiceOrderItem sor()=:" + sor.toString() ); - execution.setVariable("saction", "NONE"); return; } diff --git a/src/main/java/org/etsi/osl/osom/management/ProductOrderManager.java b/src/main/java/org/etsi/osl/osom/management/ProductOrderManager.java new file mode 100644 index 0000000000000000000000000000000000000000..19b9d6eaa77d998d073519511f05e319f479bee8 --- /dev/null +++ b/src/main/java/org/etsi/osl/osom/management/ProductOrderManager.java @@ -0,0 +1,175 @@ +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()); + } + + } + + +} diff --git a/src/main/java/org/etsi/osl/osom/management/ServiceOrderManager.java b/src/main/java/org/etsi/osl/osom/management/ServiceOrderManager.java index 6290743ba0d1e9f690c0fd62db7134e3f611de1e..54bc509931a98b683ede8b543afa2c023a7af1a4 100644 --- a/src/main/java/org/etsi/osl/osom/management/ServiceOrderManager.java +++ b/src/main/java/org/etsi/osl/osom/management/ServiceOrderManager.java @@ -35,11 +35,16 @@ import org.etsi.osl.model.nfv.DeploymentDescriptor; import org.etsi.osl.model.nfv.NetworkServiceDescriptor; import org.etsi.osl.model.nfv.ScaleDescriptor; import org.etsi.osl.osom.serviceactions.NSActionRequestPayload; +import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob; +import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJobFVO; import org.etsi.osl.tmf.pm632.model.Organization; +import org.etsi.osl.tmf.rcm634.model.LogicalResourceSpecification; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecification; import org.etsi.osl.tmf.ri639.model.LogicalResource; import org.etsi.osl.tmf.ri639.model.PhysicalResource; import org.etsi.osl.tmf.ri639.model.Resource; import org.etsi.osl.tmf.ri639.model.ResourceCreate; +import org.etsi.osl.tmf.ri639.model.ResourceUpdate; import org.etsi.osl.tmf.scm633.model.ServiceSpecification; import org.etsi.osl.tmf.sim638.model.ServiceActionQueueItem; import org.etsi.osl.tmf.sim638.model.ServiceCreate; @@ -188,8 +193,14 @@ public class ServiceOrderManager { @Value("${CATALOG_GET_RESOURCE_BY_ID}") private String CATALOG_GET_RESOURCE_BY_ID = ""; + + @Value("${CATALOG_GET_RESOURCESPEC_BY_ID}") + private String CATALOG_GET_RESOURCESPEC_BY_ID = ""; + + @Value("${PM_MEASUREMENT_COLLECTION_JOB_ADD}") + private String PM_MEASUREMENT_COLLECTION_JOB_ADD = ""; + - @Transactional public void processOrder(ServiceOrder serviceOrder) { @@ -1082,6 +1093,82 @@ public class ServiceOrderManager { } + public Resource gcGenericResourceDeploymentRequest(String queueName, Map<String, Object> map, ResourceUpdate aResource) { + try { + + logger.debug("gcGenericResourceDeploymentRequest queueName=" + queueName); + + String req = toJsonString(aResource); + Object response = template.requestBodyAndHeaders( queueName, req , map ); + + + if ( !(response instanceof String)) { + logger.error("gcGenericResourceDeploymentRequest response object is wrong."); + return null; + } + logger.debug("gcGenericResourceDeploymentRequest response is: " + response); + Resource res = toJsonObj( (String)response, LogicalResource.class); + return res; + + }catch (Exception e) { + logger.error("Cannot retrieve gcGenericResourceDeploymentRequest response. " + e.toString()); + e.printStackTrace(); + } + return null; + } + + + + + /** + * get service spec by id from model via bus + * @param id + * @return + * @throws IOException + */ + public ResourceSpecification retrieveResourceSpec(String specid) { + logger.info("will retrieve Resource Specification id=" + specid ); + + try { + Object response = template. + requestBody( CATALOG_GET_RESOURCESPEC_BY_ID, specid); + + if ( !(response instanceof String)) { + logger.error("Resource Specification object is wrong."); + return null; + } + LogicalResourceSpecification sor = toJsonObj( (String)response, LogicalResourceSpecification.class); + //logger.debug("retrieveSpec response is: " + response); + return sor; + + }catch (Exception e) { + logger.error("Cannot retrieve Resource Specification details from catalog. " + e.toString()); + } + return null; + } + + + public MeasurementCollectionJob addMeasurementCollectionJob(MeasurementCollectionJobFVO mcjFVO) { + + logger.debug("Will create a new Measurement Collection Job"); + try { + Object response = template. + requestBody( PM_MEASUREMENT_COLLECTION_JOB_ADD, toJsonString(mcjFVO)); + if ( !(response instanceof String)) { + logger.error("Measurement Collection Job object is wrong."); + return null; + } + logger.debug("retrieveMeasurementCollectionJobById response is: " + response); + MeasurementCollectionJob mcj = toJsonObj( (String)response, MeasurementCollectionJob.class); + return mcj; + }catch (Exception e) { + logger.error("Cannot create a new Measurement Collection Job. " + e.toString()); + } + return null; +} + + + } diff --git a/src/main/java/org/etsi/osl/osom/serviceactions/AutomaticallyHandleAction.java b/src/main/java/org/etsi/osl/osom/serviceactions/AutomaticallyHandleAction.java index 6bc7ce47c582184d1a9e7161655637b1df52461c..2602be868670d9edc9ab2d3551eab2a468768d99 100644 --- a/src/main/java/org/etsi/osl/osom/serviceactions/AutomaticallyHandleAction.java +++ b/src/main/java/org/etsi/osl/osom/serviceactions/AutomaticallyHandleAction.java @@ -2,21 +2,40 @@ package org.etsi.osl.osom.serviceactions; import java.time.OffsetDateTime; import java.time.ZoneOffset; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.etsi.osl.osom.management.ServiceOrderManager; +import org.etsi.osl.tmf.common.model.AttachmentRefOrValue; +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.prm669.model.RelatedParty; +import org.etsi.osl.tmf.ri639.model.Feature; +import org.etsi.osl.tmf.ri639.model.Resource; +import org.etsi.osl.tmf.ri639.model.ResourceCreate; +import org.etsi.osl.tmf.ri639.model.ResourceRelationship; +import org.etsi.osl.tmf.ri639.model.ResourceUpdate; import org.etsi.osl.tmf.sim638.model.Service; +import org.etsi.osl.tmf.sim638.model.ServiceActionQueueAction; import org.etsi.osl.tmf.sim638.model.ServiceActionQueueItem; +import org.etsi.osl.tmf.sim638.model.ServiceOrderRef; import org.etsi.osl.tmf.sim638.model.ServiceUpdate; 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 = "AutomaticallyHandleAction") //bean name public class AutomaticallyHandleAction implements JavaDelegate { @@ -31,7 +50,8 @@ public class AutomaticallyHandleAction implements JavaDelegate { public void execute(DelegateExecution execution) { - logger.info("AutomaticallyHandleAction:" + execution.getVariableNames().toString() ); + logger.debug("AutomaticallyHandleAction:" + execution.getVariableNames().toString() ); + logger.debug("VariableNames:" + execution.getVariableNames().toString()); ObjectMapper mapper = new ObjectMapper(); @@ -42,12 +62,85 @@ public class AutomaticallyHandleAction implements JavaDelegate { item = mapper.readValue( execution.getVariable("serviceActionItem").toString(), ServiceActionQueueItem.class); aService = mapper.readValue( execution.getVariable("Service").toString(), Service.class); + if ( aService.getSupportingResource().stream().findFirst().isPresent() ) { //there is a resourceRef + + ResourceRef rr = aService.getSupportingResource().stream().findFirst().get(); + + Resource relatedResource = serviceOrderManager.retrieveResource( rr.getId() ); + + ResourceUpdate aResourceUpdate = resourceToResourceUpdate(relatedResource); + + //pass characteristic values from services to resource + Optional<ServiceOrderRef> sref = aService.getServiceOrder().stream().findFirst(); + String serviceOrderID=""; + if ( sref.isPresent()) { + serviceOrderID = sref.get().getId(); + } + + Boolean allServiceAndResourceCharacteristicsAreTheSame = true; + Boolean onlyStatusCharacteristicsChanged = true; + for (org.etsi.osl.tmf.ri639.model.Characteristic resCharacteristic : aResourceUpdate.getResourceCharacteristic()) { + Characteristic servChar = aService.getServiceCharacteristicByName( resCharacteristic.getName() ); + if ( servChar !=null) { + //we need to check if the characteristics that changed are only from the resources (e.g. start with status. ) + //if there are only from resources then we will not snd back an update request, otherwise we get into an infinite loop + if ( resCharacteristic.getValue().getValue() != null && + servChar.getValue().getValue() != null && + !resCharacteristic.getValue().getValue().equals( servChar.getValue().getValue() ) ) { + allServiceAndResourceCharacteristicsAreTheSame = false; + if ( !servChar.getValue().getValue().startsWith("status.") ) { + onlyStatusCharacteristicsChanged = false; + } else { + + logger.debug("Only Status Characteristic Changed. Will not update the resource!" ); + } + } + + + resCharacteristic.getValue().setValue( servChar.getValue().getValue() ); + + } + } + + + try{ + + Resource response = null; + + if ( item.getAction().equals( ServiceActionQueueAction.EVALUATE_CHARACTERISTIC_CHANGED ) + || item.getAction().equals( ServiceActionQueueAction.EVALUATE_CHILD_CHARACTERISTIC_CHANGED ) + || item.getAction().equals( ServiceActionQueueAction.EVALUATE_CHARACTERISTIC_CHANGED_MANODAY2 ) ) { + + if ( !onlyStatusCharacteristicsChanged && !allServiceAndResourceCharacteristicsAreTheSame) { + response = createNewResourceDeploymentRequest(aService, + relatedResource, aResourceUpdate, + serviceOrderID ); + + } + } else { + + response = createNewResourceDeleteRequest(aService, + relatedResource, aResourceUpdate, + serviceOrderID ); + } + + + }catch (Exception e) { + e.printStackTrace(); + } + + + } + + + ServiceUpdate supd = new ServiceUpdate(); Note n = new Note(); n.setText("Service Action AutomaticallyHandleAction. Action: " + item.getAction() ); n.setAuthor( compname ); n.setDate( OffsetDateTime.now(ZoneOffset.UTC).toString() ); supd.addNoteItem( n ); + serviceOrderManager.deleteServiceActionQueueItem( item ); serviceOrderManager.updateService( aService.getId() , supd, false); @@ -60,5 +153,113 @@ public class AutomaticallyHandleAction implements JavaDelegate { return; } } + + + private ResourceUpdate resourceToResourceUpdate(Resource source) { + if ( source == null ) { + return null; + } + + ResourceUpdate resourceUpdate = new ResourceUpdate(); + + resourceUpdate.setCategory( source.getCategory() ); + resourceUpdate.setDescription( source.getDescription() ); + resourceUpdate.setEndOperatingDate( source.getEndOperatingDate() ); + resourceUpdate.setName( source.getName() ); + resourceUpdate.setResourceVersion( source.getResourceVersion() ); + resourceUpdate.setStartOperatingDate( source.getStartOperatingDate() ); + Set<Feature> set = source.getActivationFeature(); + if ( set != null ) { + resourceUpdate.setActivationFeature( new ArrayList<Feature>( set ) ); + } + resourceUpdate.setAdministrativeState( source.getAdministrativeState() ); + Set<AttachmentRefOrValue> set1 = source.getAttachment(); + if ( set1 != null ) { + resourceUpdate.setAttachment( new ArrayList<AttachmentRefOrValue>( set1 ) ); + } + Set<Note> set2 = source.getNote(); + if ( set2 != null ) { + resourceUpdate.setNote( new ArrayList<Note>( set2 ) ); + } + resourceUpdate.setOperationalState( source.getOperationalState() ); + resourceUpdate.setPlace( source.getPlace() ); + Set<RelatedParty> set3 = source.getRelatedParty(); + if ( set3 != null ) { + resourceUpdate.setRelatedParty( new ArrayList<RelatedParty>( set3 ) ); + } + @Valid Set<org.etsi.osl.tmf.ri639.model.Characteristic> set4 = source.getResourceCharacteristic(); + if ( set4 != null ) { + resourceUpdate.setResourceCharacteristic( new ArrayList<org.etsi.osl.tmf.ri639.model.Characteristic>( set4 ) ); + } + Set<ResourceRelationship> set5 = source.getResourceRelationship(); + if ( set5 != null ) { + resourceUpdate.setResourceRelationship( new ArrayList<ResourceRelationship>( set5 ) ); + } + resourceUpdate.setResourceSpecification( source.getResourceSpecification() ); + resourceUpdate.setResourceStatus( source.getResourceStatus() ); + resourceUpdate.setUsageState( source.getUsageState() ); + + return resourceUpdate; + } + + private Resource createNewResourceDeploymentRequest( Service aService, + Resource resourceI, + ResourceUpdate aResourceUpdate, + String orderId) { + + try { + Map<String, Object> map = new HashMap<>(); + map.put("org.etsi.osl.serviceId", aService.getId() ); + map.put("org.etsi.osl.resourceId", resourceI.getId() ); + map.put("org.etsi.osl.prefixName", "gr" + resourceI.getId().substring(0, 8) ); + map.put("org.etsi.osl.serviceOrderId", orderId ); + + + logger.debug("createNewResourceDeploymentRequest "); + + String queueName = "jms:queue:UPDATE/"+ aResourceUpdate.getCategory() + "/" + aResourceUpdate.getResourceVersion() ; + Resource response = serviceOrderManager.gcGenericResourceDeploymentRequest(queueName , map, aResourceUpdate); + + + return response; + + } catch (Exception e) { + logger.error("cridgeDeploymentRequest failed"); + e.printStackTrace(); + } + + return null; + + } + + private Resource createNewResourceDeleteRequest( Service aService, + Resource resourceI, + ResourceUpdate aResourceUpdate, + String orderId) { + + try { + Map<String, Object> map = new HashMap<>(); + map.put("org.etsi.osl.serviceId", aService.getId() ); + map.put("org.etsi.osl.resourceId", resourceI.getId() ); + map.put("org.etsi.osl.prefixName", "gr" + resourceI.getId().substring(0, 8) ); + map.put("org.etsi.osl.serviceOrderId", orderId ); + + + logger.debug("createNewResourceDeploymentRequest "); + + String queueName = "jms:queue:DELETE/"+ aResourceUpdate.getCategory() + "/" + aResourceUpdate.getResourceVersion() ; + Resource response = serviceOrderManager.gcGenericResourceDeploymentRequest(queueName , map, aResourceUpdate); + + + return response; + + } catch (Exception e) { + logger.error("cridgeDeploymentRequest failed"); + e.printStackTrace(); + } + + return null; + + } } diff --git a/src/main/resources/GenericResourceController.md b/src/main/resources/GenericResourceController.md new file mode 100644 index 0000000000000000000000000000000000000000..55b4418af999439233e07bcd686f853d816a0316 --- /dev/null +++ b/src/main/resources/GenericResourceController.md @@ -0,0 +1,90 @@ +@startuml + +group Controller Startup [Controller Registration] + + control "ResourceController" as ResourceController + entity "TMFAPI" as TMFAPI + queue MQa + + ResourceController -> MQa: RegisterResourceSpec + MQa -> TMFAPI: RegisterResourceSpec + note left + Register a ResourceSpec with + Name, Category, Version + end note + ResourceController -> MQa: QueueRegister + note left + CREATE/<category_name>/<version> + UPDATE/<category_name>/<version> + DELETE/<category_name>/<version> + end note + + +end + + +group Create RFS [Create RFS and underlying resource] + control "ResourceController" as ResourceController + entity "TMFAPI" as TMFAPI + queue MQa + entity "OSOM" as OSOM + + + TMFAPI -> OSOM: ServiceOrderCreate + + OSOM -> OSOM: ServiceCreateTMF + OSOM->MQa : ServiceCreateMSG + MQa -> TMFAPI: ServiceCreateMSG + activate TMFAPI + return Service + MQa -> OSOM: Service + + OSOM -> OSOM: ResourceCreateTMF + + OSOM->MQa : ResourceCreateMSG + MQa -> TMFAPI: ResourceCreate MSG + activate TMFAPI + return Resource + MQa -> OSOM: Resource + + + OSOM -> OSOM: ResourceDeployment + OSOM -> MQa : CreateGenericResourceMSG + note left + Header contains + more metadata + (ServiceID, ResourceID, OrderID) + end note + MQa -> ResourceController: CreateGenericResourceMSG [CREATE/<category_name>/<version>] + + OSOM -> OSOM: WaitFor resourceStatus + +end + + +group Resource Controller Process[Process underlying resource] + ResourceController -> ResourceController: ProcessRequest + + ResourceController->MQa : ResourceUpdate + MQa -> TMFAPI: ResourceUpdate + activate TMFAPI + return Resource + MQa -> ResourceController: Resource + +end + +group OSOM Check Deployment [Wait for underlying resource] + OSOM -> OSOM: WaitFor resourceStatus + OSOM->MQa: Check GETResource + MQa -> TMFAPI: GETResource + activate TMFAPI + return Resource + MQa -> OSOM: Resource + note left + Check resource Status + (e.g. ACTIVE or RESERVED or ALARM) + end note +end + + +@enduml \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index fd9ed495e9e7ac6aac458ce40f605294166ee911..55f42c5636cfe3b05067d1761724e6c8d98b354e 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,6 +1,9 @@ server: port: 13689 +flowable: + history-level: none + spring: application: name: openslice-osom @@ -75,6 +78,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" @@ -103,9 +119,12 @@ CATALOG_ADD_RESOURCESPEC: "jms:queue:CATALOG.ADD.RESOURCESPEC" CATALOG_UPD_RESOURCESPEC: "jms:queue:CATALOG.UPD.RESOURCESPEC" CATALOG_UPDADD_RESOURCESPEC: "jms:queue:CATALOG.UPDADD.RESOURCESPEC" CATALOG_GET_RESOURCESPEC_BY_ID: "jms:queue:CATALOG.GET.RESOURCESPEC_BY_ID" -CATALOG_GET_RESOURCESPEC_BY_ÎAME_CATEGORY: "jms:queue:CATALOG.GET.RESOURCESPEC_BY_ÎAME_CATEGORY" +CATALOG_GET_RESOURCESPEC_BY_NAME_CATEGORY: "jms:queue:CATALOG.GET.RESOURCESPEC_BY_NAME_CATEGORY" #CRD ACTIONS CRD_DEPLOY_CR_REQ: "jms:queue:CRD.DEPLOY.CR_REQ" CRD_DELETE_CR_REQ: "jms:queue:CRD.DELETE.CR_REQ" -CRD_PATCH_CR_REQ: "jms:queue:CRD.PATCH.CR_REQ" \ No newline at end of file +CRD_PATCH_CR_REQ: "jms:queue:CRD.PATCH.CR_REQ" + +#TMF628 ACTIONS +PM_MEASUREMENT_COLLECTION_JOB_ADD: "jms:queue:PM.MEASUREMENTCOLLECTIONJOB.ADD" \ No newline at end of file diff --git a/src/main/resources/processes/GenericControllerDeploymentReq.bpmn b/src/main/resources/processes/GenericControllerDeploymentReq.bpmn new file mode 100644 index 0000000000000000000000000000000000000000..ac06cd088d00f287bd0571384f7c441b62161aa7 --- /dev/null +++ b/src/main/resources/processes/GenericControllerDeploymentReq.bpmn @@ -0,0 +1,79 @@ +<?xml version="1.0" encoding="UTF-8"?> +<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"> + <process id="procGenericControllerDeploymentRequest" name="Generic Controller Deployment Request process" isExecutable="true"> + <startEvent id="startevent1" name="Start"></startEvent> + <serviceTask id="stGCCreatetask" name="Generic Controller Create Task" activiti:delegateExpression="${gcOrchestrationService}"></serviceTask> + <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="stGCCreatetask"></sequenceFlow> + <serviceTask id="stCheckGCServiceDeployment" name="Check Generic Controller Service Deployment" activiti:delegateExpression="${gcOrchestrationCheckDeploymentService}"></serviceTask> + <sequenceFlow id="flow2" sourceRef="stGCCreatetask" targetRef="stCheckGCServiceDeployment"></sequenceFlow> + <exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway"></exclusiveGateway> + <sequenceFlow id="flow3" sourceRef="stCheckGCServiceDeployment" targetRef="exclusivegateway1"></sequenceFlow> + <intermediateCatchEvent id="timerintermediatecatchevent1" name="Timer start wait 30 secs"> + <timerEventDefinition> + <timeDuration>PT30S</timeDuration> + </timerEventDefinition> + </intermediateCatchEvent> + <sequenceFlow id="flowserviceDeploymentNotFinished" name="Service Deployment Not Finished" sourceRef="exclusivegateway1" targetRef="timerintermediatecatchevent1"> + <conditionExpression xsi:type="tFormalExpression"><![CDATA[${!serviceDeploymentFinished}]]></conditionExpression> + </sequenceFlow> + <sequenceFlow id="flow5" sourceRef="timerintermediatecatchevent1" targetRef="stCheckGCServiceDeployment"></sequenceFlow> + <endEvent id="endevent1" name="End"></endEvent> + <sequenceFlow id="flowServiceDeploymentFinished" name="Service Deployment Finished" sourceRef="exclusivegateway1" targetRef="endevent1"> + <conditionExpression xsi:type="tFormalExpression"><![CDATA[${serviceDeploymentFinished}]]></conditionExpression> + </sequenceFlow> + </process> + <bpmndi:BPMNDiagram id="BPMNDiagram_procGenericControllerDeploymentRequest"> + <bpmndi:BPMNPlane bpmnElement="procGenericControllerDeploymentRequest" id="BPMNPlane_procGenericControllerDeploymentRequest"> + <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"> + <omgdc:Bounds height="35.0" width="35.0" x="121.0" y="145.0"></omgdc:Bounds> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape bpmnElement="stGCCreatetask" id="BPMNShape_stGCCreatetask"> + <omgdc:Bounds height="63.0" width="105.0" x="210.0" y="130.0"></omgdc:Bounds> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape bpmnElement="stCheckGCServiceDeployment" id="BPMNShape_stCheckGCServiceDeployment"> + <omgdc:Bounds height="83.0" width="111.0" x="390.0" y="120.0"></omgdc:Bounds> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1"> + <omgdc:Bounds height="40.0" width="40.0" x="700.0" y="147.0"></omgdc:Bounds> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape bpmnElement="timerintermediatecatchevent1" id="BPMNShape_timerintermediatecatchevent1"> + <omgdc:Bounds height="35.0" width="35.0" x="593.0" y="250.0"></omgdc:Bounds> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"> + <omgdc:Bounds height="35.0" width="35.0" x="850.0" y="150.0"></omgdc:Bounds> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"> + <omgdi:waypoint x="156.0" y="162.0"></omgdi:waypoint> + <omgdi:waypoint x="210.0" y="161.0"></omgdi:waypoint> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"> + <omgdi:waypoint x="315.0" y="161.0"></omgdi:waypoint> + <omgdi:waypoint x="390.0" y="161.0"></omgdi:waypoint> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3"> + <omgdi:waypoint x="501.0" y="161.0"></omgdi:waypoint> + <omgdi:waypoint x="700.0" y="167.0"></omgdi:waypoint> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge bpmnElement="flowserviceDeploymentNotFinished" id="BPMNEdge_flowserviceDeploymentNotFinished"> + <omgdi:waypoint x="720.0" y="187.0"></omgdi:waypoint> + <omgdi:waypoint x="719.0" y="267.0"></omgdi:waypoint> + <omgdi:waypoint x="628.0" y="267.0"></omgdi:waypoint> + <bpmndi:BPMNLabel> + <omgdc:Bounds height="42.0" width="100.0" x="721.0" y="208.0"></omgdc:Bounds> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5"> + <omgdi:waypoint x="593.0" y="267.0"></omgdi:waypoint> + <omgdi:waypoint x="445.0" y="267.0"></omgdi:waypoint> + <omgdi:waypoint x="445.0" y="203.0"></omgdi:waypoint> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge bpmnElement="flowServiceDeploymentFinished" id="BPMNEdge_flowServiceDeploymentFinished"> + <omgdi:waypoint x="740.0" y="167.0"></omgdi:waypoint> + <omgdi:waypoint x="850.0" y="167.0"></omgdi:waypoint> + <bpmndi:BPMNLabel> + <omgdc:Bounds height="42.0" width="100.0" x="739.0" y="132.0"></omgdc:Bounds> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + </bpmndi:BPMNPlane> + </bpmndi:BPMNDiagram> +</definitions> \ No newline at end of file diff --git a/src/main/resources/processes/MetricoDeploymentReq.bpmn b/src/main/resources/processes/MetricoDeploymentReq.bpmn new file mode 100644 index 0000000000000000000000000000000000000000..c931982d3438fea8d68082924fe5b76c9fa1f807 --- /dev/null +++ b/src/main/resources/processes/MetricoDeploymentReq.bpmn @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8"?> +<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"> + <process id="procMetricoDeploymentRequest" name="Metrico Deployment Request" isExecutable="true"> + <startEvent id="startevent1" name="Start"></startEvent> + <serviceTask id="stMetricoCreateTask" name="Metrico Create Task" activiti:delegateExpression="${metricoOrchestrationService}"></serviceTask> + <serviceTask id="stCheckMetricoServiceDeployment" name="Check METRICO Service Deployment" activiti:delegateExpression="${metricoOrchestrationCheckDeploymentService}"></serviceTask> + <exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway"></exclusiveGateway> + <intermediateCatchEvent id="timerintermediatecatchevent1" name="TimerCatchEvent"> + <timerEventDefinition> + <timeDuration>PT30S</timeDuration> + </timerEventDefinition> + </intermediateCatchEvent> + <sequenceFlow id="flow3" sourceRef="stCheckMetricoServiceDeployment" targetRef="exclusivegateway1"></sequenceFlow> + <sequenceFlow id="flow4" sourceRef="exclusivegateway1" targetRef="timerintermediatecatchevent1"> + <conditionExpression xsi:type="tFormalExpression"><![CDATA[${!serviceDeploymentFinished}]]></conditionExpression> + </sequenceFlow> + <endEvent id="endevent1" name="End"></endEvent> + <sequenceFlow id="flow5" sourceRef="exclusivegateway1" targetRef="endevent1"></sequenceFlow> + <sequenceFlow id="flow6" sourceRef="timerintermediatecatchevent1" targetRef="stCheckMetricoServiceDeployment"></sequenceFlow> + <sequenceFlow id="flow7" sourceRef="stMetricoCreateTask" targetRef="stCheckMetricoServiceDeployment"></sequenceFlow> + <sequenceFlow id="flow8" sourceRef="startevent1" targetRef="stMetricoCreateTask"></sequenceFlow> + </process> + <bpmndi:BPMNDiagram id="BPMNDiagram_procMetricoDeploymentRequest"> + <bpmndi:BPMNPlane bpmnElement="procMetricoDeploymentRequest" id="BPMNPlane_procMetricoDeploymentRequest"> + <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"> + <omgdc:Bounds height="35.0" width="35.0" x="120.0" y="165.0"></omgdc:Bounds> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape bpmnElement="stMetricoCreateTask" id="BPMNShape_stMetricoCreateTask"> + <omgdc:Bounds height="91.0" width="105.0" x="250.0" y="140.0"></omgdc:Bounds> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape bpmnElement="stCheckMetricoServiceDeployment" id="BPMNShape_stCheckMetricoServiceDeployment"> + <omgdc:Bounds height="91.0" width="105.0" x="500.0" y="140.0"></omgdc:Bounds> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1"> + <omgdc:Bounds height="40.0" width="40.0" x="800.0" y="165.0"></omgdc:Bounds> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape bpmnElement="timerintermediatecatchevent1" id="BPMNShape_timerintermediatecatchevent1"> + <omgdc:Bounds height="35.0" width="35.0" x="650.0" y="330.0"></omgdc:Bounds> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"> + <omgdc:Bounds height="35.0" width="35.0" x="950.0" y="165.0"></omgdc:Bounds> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3"> + <omgdi:waypoint x="605.0" y="185.0"></omgdi:waypoint> + <omgdi:waypoint x="800.0" y="185.0"></omgdi:waypoint> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4"> + <omgdi:waypoint x="820.0" y="205.0"></omgdi:waypoint> + <omgdi:waypoint x="820.0" y="347.0"></omgdi:waypoint> + <omgdi:waypoint x="685.0" y="347.0"></omgdi:waypoint> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5"> + <omgdi:waypoint x="840.0" y="185.0"></omgdi:waypoint> + <omgdi:waypoint x="950.0" y="182.0"></omgdi:waypoint> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6"> + <omgdi:waypoint x="650.0" y="347.0"></omgdi:waypoint> + <omgdi:waypoint x="552.0" y="347.0"></omgdi:waypoint> + <omgdi:waypoint x="552.0" y="231.0"></omgdi:waypoint> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7"> + <omgdi:waypoint x="355.0" y="185.0"></omgdi:waypoint> + <omgdi:waypoint x="500.0" y="185.0"></omgdi:waypoint> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge bpmnElement="flow8" id="BPMNEdge_flow8"> + <omgdi:waypoint x="155.0" y="182.0"></omgdi:waypoint> + <omgdi:waypoint x="250.0" y="185.0"></omgdi:waypoint> + </bpmndi:BPMNEdge> + </bpmndi:BPMNPlane> + </bpmndi:BPMNDiagram> +</definitions> \ No newline at end of file diff --git a/src/main/resources/processes/ProcessOrderItemProcess.bpmn b/src/main/resources/processes/ProcessOrderItemProcess.bpmn index 4f386ce6a8bc381dd822dce0f16c5f7092f9d025..a6b64894f9cb0d6ea343ef4c579a1dadf472424e 100644 --- a/src/main/resources/processes/ProcessOrderItemProcess.bpmn +++ b/src/main/resources/processes/ProcessOrderItemProcess.bpmn @@ -26,6 +26,9 @@ <sequenceFlow id="flow30" sourceRef="stActionDELETE" targetRef="stProcesOrderItemComplete"></sequenceFlow> <sequenceFlow id="flow31" sourceRef="stProcesOrderItemComplete" targetRef="endevent2"></sequenceFlow> <sequenceFlow id="flow32" sourceRef="stActionADD" targetRef="CreateServiceProcess"></sequenceFlow> + <sequenceFlow id="flow33" name="saction=='NONE'" sourceRef="exclusivegateway1" targetRef="endevent2"> + <conditionExpression xsi:type="tFormalExpression"><![CDATA[${saction=='NONE'}]]></conditionExpression> + </sequenceFlow> </process> <bpmndi:BPMNDiagram id="BPMNDiagram_ProcessOrderItem"> <bpmndi:BPMNPlane bpmnElement="ProcessOrderItem" id="BPMNPlane_ProcessOrderItem"> @@ -85,7 +88,7 @@ <omgdi:waypoint x="320.0" y="367.0"></omgdi:waypoint> <omgdi:waypoint x="464.0" y="367.0"></omgdi:waypoint> <bpmndi:BPMNLabel> - <omgdc:Bounds height="14.0" width="88.0" x="340.0" y="339.0"></omgdc:Bounds> + <omgdc:Bounds height="14.0" width="100.0" x="340.0" y="339.0"></omgdc:Bounds> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow28" id="BPMNEdge_flow28"> @@ -111,6 +114,15 @@ <omgdi:waypoint x="515.0" y="87.0"></omgdi:waypoint> <omgdi:waypoint x="560.0" y="87.0"></omgdi:waypoint> </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge bpmnElement="flow33" id="BPMNEdge_flow33"> + <omgdi:waypoint x="320.0" y="197.0"></omgdi:waypoint> + <omgdi:waypoint x="319.0" y="467.0"></omgdi:waypoint> + <omgdi:waypoint x="867.0" y="467.0"></omgdi:waypoint> + <omgdi:waypoint x="867.0" y="191.0"></omgdi:waypoint> + <bpmndi:BPMNLabel> + <omgdc:Bounds height="14.0" width="100.0" x="335.0" y="449.0"></omgdc:Bounds> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </definitions> \ No newline at end of file diff --git a/src/main/resources/processes/ProductOrderProcess.bpmn b/src/main/resources/processes/ProductOrderProcess.bpmn new file mode 100644 index 0000000000000000000000000000000000000000..8ae9ca75079f46ec2375cc3f145e07dce3a07acc --- /dev/null +++ b/src/main/resources/processes/ProductOrderProcess.bpmn @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="UTF-8"?> +<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"> + <process id="ProductOrderSchedulerProcess" name="My process" isExecutable="true"> + <startEvent id="timerstarteventProdOrders" name="Timer start"> + <timerEventDefinition> + <timeCycle>0 0/1 * * * ?</timeCycle> + </timerEventDefinition> + </startEvent> + <serviceTask id="stFetchAcknowledgedProductOrders" name="Fetch Acknowledged Product Orders" activiti:delegateExpression="${fetchAcknowledgedProductOrders}"></serviceTask> + <sequenceFlow id="flow1" sourceRef="timerstarteventProdOrders" targetRef="stFetchAcknowledgedProductOrders"></sequenceFlow> + <endEvent id="endevent1" name="End"></endEvent> + <sequenceFlow id="flow2" sourceRef="stFetchAcknowledgedProductOrders" targetRef="stInitializeProcessProductOrder"></sequenceFlow> + <serviceTask id="stInitializeProcessProductOrder" name="Initialize Process Product Order" activiti:delegateExpression="${initializeProcessProductOrders}"></serviceTask> + <sequenceFlow id="flow3" sourceRef="stInitializeProcessProductOrder" targetRef="endevent1"></sequenceFlow> + </process> + <bpmndi:BPMNDiagram id="BPMNDiagram_ProductOrderSchedulerProcess"> + <bpmndi:BPMNPlane bpmnElement="ProductOrderSchedulerProcess" id="BPMNPlane_ProductOrderSchedulerProcess"> + <bpmndi:BPMNShape bpmnElement="timerstarteventProdOrders" id="BPMNShape_timerstarteventProdOrders"> + <omgdc:Bounds height="35.0" width="35.0" x="60.0" y="148.0"></omgdc:Bounds> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape bpmnElement="stFetchAcknowledgedProductOrders" id="BPMNShape_stFetchAcknowledgedProductOrders"> + <omgdc:Bounds height="71.0" width="121.0" x="190.0" y="130.0"></omgdc:Bounds> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"> + <omgdc:Bounds height="35.0" width="35.0" x="580.0" y="148.0"></omgdc:Bounds> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape bpmnElement="stInitializeProcessProductOrder" id="BPMNShape_stInitializeProcessProductOrder"> + <omgdc:Bounds height="71.0" width="141.0" x="380.0" y="130.0"></omgdc:Bounds> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"> + <omgdi:waypoint x="95.0" y="165.0"></omgdi:waypoint> + <omgdi:waypoint x="190.0" y="165.0"></omgdi:waypoint> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"> + <omgdi:waypoint x="311.0" y="165.0"></omgdi:waypoint> + <omgdi:waypoint x="380.0" y="165.0"></omgdi:waypoint> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3"> + <omgdi:waypoint x="521.0" y="165.0"></omgdi:waypoint> + <omgdi:waypoint x="580.0" y="165.0"></omgdi:waypoint> + </bpmndi:BPMNEdge> + </bpmndi:BPMNPlane> + </bpmndi:BPMNDiagram> +</definitions> \ No newline at end of file diff --git a/src/main/resources/processes/ServiceCreationProcess.bpmn b/src/main/resources/processes/ServiceCreationProcess.bpmn index cce6e034f6554cedf624ec3ba6e2a9df7300dd85..c2b30e719d3a1016dfbc59817606b7472bc94954 100644 --- a/src/main/resources/processes/ServiceCreationProcess.bpmn +++ b/src/main/resources/processes/ServiceCreationProcess.bpmn @@ -80,6 +80,16 @@ <conditionExpression xsi:type="tFormalExpression"><![CDATA[${brokeActivity=='RFS_CRSPEC'}]]></conditionExpression> </sequenceFlow> <sequenceFlow id="flow44" sourceRef="parallelActivityCRDeploymentReq" targetRef="servicetaskCheckForCreatedServices"></sequenceFlow> + <callActivity id="activityGenericResourceDeploymentReq" name="Generic Resource Deployment Request" calledElement="procGenericControllerDeploymentRequest" activiti:inheritVariables="true"></callActivity> + <sequenceFlow id="flow45" name="brokeActivity=="GRSPEC"" sourceRef="exclusivegateway2" targetRef="activityGenericResourceDeploymentReq"> + <conditionExpression xsi:type="tFormalExpression"><![CDATA[${brokeActivity=='GRSPEC'}]]></conditionExpression> + </sequenceFlow> + <sequenceFlow id="flow46" sourceRef="activityGenericResourceDeploymentReq" targetRef="servicetaskCheckForCreatedServices"></sequenceFlow> + <callActivity id="parallelMetricoReq" name="Metrico Request" activiti:async="true" calledElement="procMetricoDeploymentRequest" activiti:inheritVariables="true"></callActivity> + <sequenceFlow id="flow47" sourceRef="parallelMetricoReq" targetRef="servicetaskCheckForCreatedServices"></sequenceFlow> + <sequenceFlow id="flow48" name="brokeActivity=="RFS_MTSPEC"" sourceRef="exclusivegateway2" targetRef="parallelMetricoReq"> + <conditionExpression xsi:type="tFormalExpression"><![CDATA[${brokeActivity=='RFS_MTSPEC'}]]></conditionExpression> + </sequenceFlow> </process> <bpmndi:BPMNDiagram id="BPMNDiagram_CreateServiceProcess"> <bpmndi:BPMNPlane bpmnElement="CreateServiceProcess" id="BPMNPlane_CreateServiceProcess"> @@ -140,6 +150,12 @@ <bpmndi:BPMNShape bpmnElement="parallelActivityCRDeploymentReq" id="BPMNShape_parallelActivityCRDeploymentReq"> <omgdc:Bounds height="90.0" width="129.0" x="1094.0" y="332.0"></omgdc:Bounds> </bpmndi:BPMNShape> + <bpmndi:BPMNShape bpmnElement="activityGenericResourceDeploymentReq" id="BPMNShape_activityGenericResourceDeploymentReq"> + <omgdc:Bounds height="71.0" width="130.0" x="1094.0" y="820.0"></omgdc:Bounds> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape bpmnElement="parallelMetricoReq" id="BPMNShape_parallelMetricoReq"> + <omgdc:Bounds height="71.0" width="121.0" x="1070.0" y="900.0"></omgdc:Bounds> + </bpmndi:BPMNShape> <bpmndi:BPMNEdge bpmnElement="flow19" id="BPMNEdge_flow19"> <omgdi:waypoint x="72.0" y="230.0"></omgdi:waypoint> <omgdi:waypoint x="100.0" y="231.0"></omgdi:waypoint> @@ -156,7 +172,7 @@ <omgdi:waypoint x="557.0" y="250.0"></omgdi:waypoint> <omgdi:waypoint x="557.0" y="326.0"></omgdi:waypoint> <bpmndi:BPMNLabel> - <omgdc:Bounds height="70.0" width="100.0" x="567.0" y="256.0"></omgdc:Bounds> + <omgdc:Bounds height="65.0" width="100.0" x="567.0" y="256.0"></omgdc:Bounds> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow23" id="BPMNEdge_flow23"> @@ -168,7 +184,7 @@ <omgdi:waypoint x="577.0" y="230.0"></omgdi:waypoint> <omgdi:waypoint x="711.0" y="230.0"></omgdi:waypoint> <bpmndi:BPMNLabel> - <omgdc:Bounds height="42.0" width="100.0" x="576.0" y="197.0"></omgdc:Bounds> + <omgdc:Bounds height="39.0" width="100.0" x="576.0" y="197.0"></omgdc:Bounds> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow25" id="BPMNEdge_flow25"> @@ -184,7 +200,7 @@ <omgdi:waypoint x="907.0" y="283.0"></omgdi:waypoint> <omgdi:waypoint x="1094.0" y="283.0"></omgdi:waypoint> <bpmndi:BPMNLabel> - <omgdc:Bounds height="42.0" width="100.0" x="917.0" y="270.0"></omgdc:Bounds> + <omgdc:Bounds height="39.0" width="100.0" x="917.0" y="270.0"></omgdc:Bounds> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow28" id="BPMNEdge_flow28"> @@ -192,7 +208,7 @@ <omgdi:waypoint x="907.0" y="520.0"></omgdi:waypoint> <omgdi:waypoint x="1094.0" y="520.0"></omgdi:waypoint> <bpmndi:BPMNLabel> - <omgdc:Bounds height="42.0" width="100.0" x="927.0" y="484.0"></omgdc:Bounds> + <omgdc:Bounds height="39.0" width="100.0" x="927.0" y="484.0"></omgdc:Bounds> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow29" id="BPMNEdge_flow29"> @@ -200,7 +216,7 @@ <omgdi:waypoint x="907.0" y="625.0"></omgdi:waypoint> <omgdi:waypoint x="1095.0" y="625.0"></omgdi:waypoint> <bpmndi:BPMNLabel> - <omgdc:Bounds height="42.0" width="100.0" x="917.0" y="584.0"></omgdc:Bounds> + <omgdc:Bounds height="39.0" width="100.0" x="917.0" y="584.0"></omgdc:Bounds> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow30" id="BPMNEdge_flow30"> @@ -208,7 +224,7 @@ <omgdi:waypoint x="907.0" y="100.0"></omgdi:waypoint> <omgdi:waypoint x="1040.0" y="100.0"></omgdi:waypoint> <bpmndi:BPMNLabel> - <omgdc:Bounds height="42.0" width="100.0" x="917.0" y="131.0"></omgdc:Bounds> + <omgdc:Bounds height="39.0" width="100.0" x="917.0" y="131.0"></omgdc:Bounds> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow31" id="BPMNEdge_flow31"> @@ -220,7 +236,7 @@ <omgdi:waypoint x="1256.0" y="186.0"></omgdi:waypoint> <omgdi:waypoint x="1172.0" y="186.0"></omgdi:waypoint> <bpmndi:BPMNLabel> - <omgdc:Bounds height="42.0" width="100.0" x="1261.0" y="139.0"></omgdc:Bounds> + <omgdc:Bounds height="39.0" width="100.0" x="1261.0" y="139.0"></omgdc:Bounds> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow33" id="BPMNEdge_flow33"> @@ -233,7 +249,7 @@ <omgdi:waypoint x="1407.0" y="100.0"></omgdi:waypoint> <omgdi:waypoint x="1407.0" y="341.0"></omgdi:waypoint> <bpmndi:BPMNLabel> - <omgdc:Bounds height="42.0" width="100.0" x="1289.0" y="70.0"></omgdc:Bounds> + <omgdc:Bounds height="39.0" width="100.0" x="1289.0" y="70.0"></omgdc:Bounds> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow35" id="BPMNEdge_flow35"> @@ -256,14 +272,14 @@ <omgdi:waypoint x="557.0" y="519.0"></omgdi:waypoint> <omgdi:waypoint x="508.0" y="520.0"></omgdi:waypoint> <bpmndi:BPMNLabel> - <omgdc:Bounds height="42.0" width="100.0" x="577.0" y="393.0"></omgdc:Bounds> + <omgdc:Bounds height="39.0" width="100.0" x="577.0" y="393.0"></omgdc:Bounds> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow39" id="BPMNEdge_flow39"> <omgdi:waypoint x="537.0" y="346.0"></omgdi:waypoint> <omgdi:waypoint x="420.0" y="346.0"></omgdi:waypoint> <bpmndi:BPMNLabel> - <omgdc:Bounds height="70.0" width="100.0" x="439.0" y="290.0"></omgdc:Bounds> + <omgdc:Bounds height="65.0" width="100.0" x="439.0" y="290.0"></omgdc:Bounds> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow40" id="BPMNEdge_flow40"> @@ -276,7 +292,7 @@ <omgdi:waypoint x="907.0" y="750.0"></omgdi:waypoint> <omgdi:waypoint x="1095.0" y="750.0"></omgdi:waypoint> <bpmndi:BPMNLabel> - <omgdc:Bounds height="42.0" width="100.0" x="910.0" y="699.0"></omgdc:Bounds> + <omgdc:Bounds height="39.0" width="100.0" x="910.0" y="699.0"></omgdc:Bounds> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow42" id="BPMNEdge_flow42"> @@ -289,13 +305,39 @@ <omgdi:waypoint x="907.0" y="377.0"></omgdi:waypoint> <omgdi:waypoint x="1094.0" y="377.0"></omgdi:waypoint> <bpmndi:BPMNLabel> - <omgdc:Bounds height="42.0" width="100.0" x="941.0" y="344.0"></omgdc:Bounds> + <omgdc:Bounds height="39.0" width="100.0" x="941.0" y="344.0"></omgdc:Bounds> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow44" id="BPMNEdge_flow44"> <omgdi:waypoint x="1223.0" y="377.0"></omgdi:waypoint> <omgdi:waypoint x="1355.0" y="376.0"></omgdi:waypoint> </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge bpmnElement="flow45" id="BPMNEdge_flow45"> + <omgdi:waypoint x="907.0" y="250.0"></omgdi:waypoint> + <omgdi:waypoint x="907.0" y="855.0"></omgdi:waypoint> + <omgdi:waypoint x="1094.0" y="855.0"></omgdi:waypoint> + <bpmndi:BPMNLabel> + <omgdc:Bounds height="39.0" width="100.0" x="910.0" y="789.0"></omgdc:Bounds> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge bpmnElement="flow46" id="BPMNEdge_flow46"> + <omgdi:waypoint x="1224.0" y="855.0"></omgdi:waypoint> + <omgdi:waypoint x="1407.0" y="855.0"></omgdi:waypoint> + <omgdi:waypoint x="1407.0" y="412.0"></omgdi:waypoint> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge bpmnElement="flow47" id="BPMNEdge_flow47"> + <omgdi:waypoint x="1191.0" y="935.0"></omgdi:waypoint> + <omgdi:waypoint x="1407.0" y="935.0"></omgdi:waypoint> + <omgdi:waypoint x="1407.0" y="412.0"></omgdi:waypoint> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge bpmnElement="flow48" id="BPMNEdge_flow48"> + <omgdi:waypoint x="907.0" y="250.0"></omgdi:waypoint> + <omgdi:waypoint x="907.0" y="935.0"></omgdi:waypoint> + <omgdi:waypoint x="1070.0" y="935.0"></omgdi:waypoint> + <bpmndi:BPMNLabel> + <omgdc:Bounds height="39.0" width="100.0" x="950.0" y="879.0"></omgdc:Bounds> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </definitions> \ No newline at end of file diff --git a/src/test/java/org/etsi/osl/osom/ProcessOrderIntegrationTest.java b/src/test/java/org/etsi/osl/osom/ProcessOrderIntegrationTest.java index 7ef1c9d633fb72b3140eb9fbb2c7cc46881a8616..34e2d5a2bf8ad9055214de2120c664f3d85448a1 100644 --- a/src/test/java/org/etsi/osl/osom/ProcessOrderIntegrationTest.java +++ b/src/test/java/org/etsi/osl/osom/ProcessOrderIntegrationTest.java @@ -184,7 +184,7 @@ public class ProcessOrderIntegrationTest { assertThat(specCirros.getServiceSpecCharacteristic().size() ).isEqualTo(12); assertThat(sorder.getOrderItem().stream().findFirst().get().getService().getServiceCharacteristic().size() ).isEqualTo(2); - assertThat(repositoryService.createProcessDefinitionQuery().count()).isEqualTo(15); + assertThat(repositoryService.createProcessDefinitionQuery().count()).isEqualTo(16); assertThat(taskService.createTaskQuery().count()).isEqualTo(0); assertThat( scmocked.getRequeestedDescriptor() ).isNull();