diff --git a/src/main/java/org/etsi/osl/osom/lcm/LCMRulesExecutorVariables.java b/src/main/java/org/etsi/osl/osom/lcm/LCMRulesExecutorVariables.java index 198e5b3f1b86c237597c1225990d79515da75029..312490ca7788de280a8e6981a347bf39b050b6af 100644 --- a/src/main/java/org/etsi/osl/osom/lcm/LCMRulesExecutorVariables.java +++ b/src/main/java/org/etsi/osl/osom/lcm/LCMRulesExecutorVariables.java @@ -28,7 +28,7 @@ public class LCMRulesExecutorVariables { private Service service; private List<String> compileDiagnosticErrors; private ServiceOrderManager serviceOrderManager; - private Map<String, String> outParams; + private Map<String, Map<String, String> > outParams; /** * @param spec @@ -50,6 +50,7 @@ public class LCMRulesExecutorVariables { this.service = serviceInstance; this.serviceOrderManager = aServiceOrderManager; this.compileDiagnosticErrors = new ArrayList<>(); - this.outParams = new HashMap<String,String>(); + + this.outParams = new HashMap<>(); } } diff --git a/src/main/java/org/etsi/osl/osom/lcm/LcmBaseExecutor.java b/src/main/java/org/etsi/osl/osom/lcm/LcmBaseExecutor.java index c7e3bc81ab4a1083ac49f10e05e262918c31d2c9..c851b5d9a005afb40f51e1b51fc4afa38135e7c2 100644 --- a/src/main/java/org/etsi/osl/osom/lcm/LcmBaseExecutor.java +++ b/src/main/java/org/etsi/osl/osom/lcm/LcmBaseExecutor.java @@ -938,7 +938,7 @@ public abstract class LcmBaseExecutor { //createServiceRefIf("Bundle B", getServiceRefPropValue("BundleA", "state", "").equals("active")==true); - public boolean createServiceRefIf(String serviceName, boolean b) { + public boolean createServiceRefIf(String serviceName, boolean b, HashMap<String, String> charvals) { logger.debug( String.format("createServiceRefwhen serviceName=%s = %s", serviceName, b ) ); @@ -952,7 +952,8 @@ public abstract class LcmBaseExecutor { if (serviceIDToCheckDependcy != null) { - this.vars.getOutParams().put( serviceIDToCheckDependcy, Boolean.toString(b) ); + charvals.put("_CREATESERVICEREF_", Boolean.toString(b)); + this.vars.getOutParams().put( serviceIDToCheckDependcy, charvals ); } return false; 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 f6a8955533feda277f9f2c7468f81dd47fceb9ec..5e6270d5449de0665ac8112fea0055f9ffe99504 100644 --- a/src/main/java/org/etsi/osl/osom/management/CreateReservedService.java +++ b/src/main/java/org/etsi/osl/osom/management/CreateReservedService.java @@ -3,7 +3,9 @@ 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.osom.lcm.LCMRulesController; @@ -96,9 +98,16 @@ public class CreateReservedService implements JavaDelegate { logger.debug("Retrieved Service ID:" + spec.getId()); logger.debug("Retrieved Service Name:" + spec.getName()); + //this map contains as key the id of the serviceSpecs to be created + //and as value a Map of initial characteristics and their values + Map<String, Map<String,String>> tobeCreatedInitialCharValues = new HashMap<>(); + + if ( execution.getVariable("serviceSpecsToCreateInitialCharValues") != null ) { + tobeCreatedInitialCharValues = (Map<String, Map<String, String>>) execution.getVariable("serviceSpecsToCreateInitialCharValues"); + } //this is a main underlying service for the requested service (restriction) - Service createdUnderlService = addServicesToVariables( spec, sor, soi, parentService ); + Service createdUnderlService = addServicesToVariables( spec, sor, soi, parentService, tobeCreatedInitialCharValues ); soi.getService().setState( ServiceStateType.RESERVED ); soi.setState(ServiceOrderStateType.INPROGRESS); @@ -145,11 +154,12 @@ public class CreateReservedService implements JavaDelegate { * @param servicesHandledByNFVOAutomated * @param servicesLocallyAutomated * @param parentService + * @param tobeCreatedInitialCharValues * @return */ private Service addServicesToVariables(ServiceSpecification specrel, ServiceOrder sor, ServiceOrderItem soi, - Service parentService) { + Service parentService, Map<String, Map<String, String>> tobeCreatedInitialCharValues) { logger.debug("\tService spec name :" + specrel.getName()); logger.debug("\tService spec type :" + specrel.getType()); @@ -159,23 +169,23 @@ public class CreateReservedService implements JavaDelegate { if ( partnerOrg != null ) { - createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.AUTOMATICALLY_MANAGED, partnerOrg, parentService); + createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.AUTOMATICALLY_MANAGED, partnerOrg, parentService, tobeCreatedInitialCharValues); } else if (specrel.getType().equals("ResourceFacingServiceSpecification")) { - createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.AUTOMATICALLY_MANAGED, null, parentService); + createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.AUTOMATICALLY_MANAGED, null, parentService, tobeCreatedInitialCharValues); } else if ( specrel.getType().equals("CustomerFacingServiceSpecification") && (specrel.isIsBundle()!=null) && specrel.isIsBundle() ) { - createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.AUTOMATICALLY_MANAGED, null, parentService); + createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.AUTOMATICALLY_MANAGED, null, parentService, tobeCreatedInitialCharValues); } else if ( specrel.getType().equals("CustomerFacingServiceSpecification") && (specrel.findSpecCharacteristicByName("OSAUTOMATED") != null ) ) { - createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.AUTOMATICALLY_MANAGED, null, parentService); + createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.AUTOMATICALLY_MANAGED, null, parentService, tobeCreatedInitialCharValues); } else if ( specrel.getType().equals("CustomerFacingServiceSpecification") && (specrel.findSpecCharacteristicByName("testSpecRef") != null ) ) { - createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.AUTOMATICALLY_MANAGED, null, parentService); + createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.AUTOMATICALLY_MANAGED, null, parentService, tobeCreatedInitialCharValues); } else { - createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.MANUALLY_BY_SERVICE_PROVIDER, null, parentService); + createdServ = createServiceByServiceSpec(sor, soi, specrel, EServiceStartMode.MANUALLY_BY_SERVICE_PROVIDER, null, parentService, tobeCreatedInitialCharValues); } //add now the serviceRef @@ -226,16 +236,20 @@ public class CreateReservedService implements JavaDelegate { } - + /** * @param sor - * @param soi + * @param soi * @param spec - * @return + * @param startMode + * @param partnerOrg + * @param parentService + * @param tobeCreatedInitialCharValues + * @return */ private Service createServiceByServiceSpec(ServiceOrder sor, ServiceOrderItem soi, ServiceSpecification spec, EServiceStartMode startMode, - RelatedParty partnerOrg, Service parentService) { + RelatedParty partnerOrg, Service parentService, Map<String, Map<String, String>> tobeCreatedInitialCharValues) { ServiceCreate serviceToCreate = new ServiceCreate(); String servicename = spec.getName(); @@ -282,15 +296,33 @@ public class CreateReservedService implements JavaDelegate { } } + //this map contains as key the id of the serviceSpecs to be created + //and as value a Map of initial characteristics and their values + Map<String, String> initCharValues = tobeCreatedInitialCharValues.get( spec.getId() ); + //we need to be careful here with the bundle and the related Service Specs, to properly propagate the rules inside //first copy into the newly created service any characteristic values from the order for (ServiceSpecCharacteristic c : spec.getServiceSpecCharacteristic()) { boolean characteristicFound = false; + + //pass any initial value. This has high priority + if ( initCharValues != null ) { + if ( initCharValues.get( c.getName() ) != null ) { + Characteristic orderCharacteristic = new Characteristic() + .value( new Any( initCharValues.get( c.getName() ), initCharValues.get( c.getName() ))) ; + serviceToCreate.addServiceCharacteristicItem( helperCreateCharacteristicItem(c, orderCharacteristic ) ); + characteristicFound = true; + break; + + } + } + + for (Characteristic orderCharacteristic : soi.getService().getServiceCharacteristic()) { String specCharacteristicToSearch = spec.getName() + "::" +c.getName(); if ( orderCharacteristic.getName().equals( specCharacteristicToSearch )) { //copy only characteristics that are related from the order - serviceToCreate.addServiceCharacteristicItem( addServiceCharacteristicItem(c, orderCharacteristic) ); + serviceToCreate.addServiceCharacteristicItem( helperCreateCharacteristicItem(c, orderCharacteristic) ); characteristicFound = true; break; } @@ -301,7 +333,7 @@ public class CreateReservedService implements JavaDelegate { String specCharacteristicToSearch = c.getName(); if ( orderCharacteristic.getName().equals( specCharacteristicToSearch )) { //copy only characteristics that are related from the order - serviceToCreate.addServiceCharacteristicItem( addServiceCharacteristicItem(c, orderCharacteristic) ); + serviceToCreate.addServiceCharacteristicItem( helperCreateCharacteristicItem(c, orderCharacteristic) ); characteristicFound = true; break; } @@ -309,6 +341,8 @@ public class CreateReservedService implements JavaDelegate { } + + } if ( serviceToCreate.getServiceCharacteristic() == null ) { @@ -383,7 +417,7 @@ public class CreateReservedService implements JavaDelegate { return null; } - private Characteristic addServiceCharacteristicItem(ServiceSpecCharacteristic c, Characteristic orderCharacteristic) { + private Characteristic helperCreateCharacteristicItem(ServiceSpecCharacteristic c, Characteristic orderCharacteristic) { Characteristic serviceCharacteristicItem = new Characteristic(); serviceCharacteristicItem.setName( c.getName() ); serviceCharacteristicItem.setValueType( c.getValueType() ); 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 872cf39e394606e3455aa4b8142c26cbbd29d082..f5be29265506e746c714135b6949c69665249f95 100644 --- a/src/main/java/org/etsi/osl/osom/management/ProcessCreateServiceRules.java +++ b/src/main/java/org/etsi/osl/osom/management/ProcessCreateServiceRules.java @@ -48,6 +48,9 @@ public class ProcessCreateServiceRules implements JavaDelegate { execution.setVariable("allSupportingServicesCreated", allSupportingServicesCreated ); //by default + + + Service contextService = null; String contextServiceId = (String) execution.getVariable("contextServiceId"); if ( contextServiceId != null ) { @@ -69,29 +72,18 @@ public class ProcessCreateServiceRules implements JavaDelegate { * first find all referenced ServiceSpecs of a ServiceSpec to be created */ boolean foundCreatedButNOTACTIVEServices = false; - Map<String, Boolean> tobeCreated = new HashMap<>(); + + //this map contains as key the id of the serviceSpecs to be created + //and as value a Map of initial characteristics and their values + Map<String, Map<String,String>> tobeCreated = new HashMap<>(); + for (ServiceSpecRelationship specRels : spec.getServiceSpecRelationship()) { logger.debug("\tService specRelsId:" + specRels.getId()); - tobeCreated.put(specRels.getId(), true); + tobeCreated.put(specRels.getId(), null); } - for ( ServiceRef serviceRef: contextService.getSupportingService() ) { - - Service theServiceReferenced = serviceOrderManager.retrieveService( serviceRef.getId() ); - - if ( tobeCreated.get(theServiceReferenced.getServiceSpecificationRef().getId() ) != null ) { - tobeCreated.put( theServiceReferenced.getServiceSpecificationRef().getId(), false); - } - - if ( theServiceReferenced != null ) { - if ( theServiceReferenced.getState().equals( ServiceStateType.RESERVED) ) { - foundCreatedButNOTACTIVEServices = true; - } - } - - } /** @@ -123,20 +115,45 @@ public class ProcessCreateServiceRules implements JavaDelegate { for (String serviceId : vars.getOutParams().keySet()) { if ( vars.getOutParams().get(serviceId) !=null) { - if ( vars.getOutParams().get(serviceId).equals( "true") ) { - tobeCreated.put( serviceId, true && tobeCreated.get(serviceId) ); - } else { - tobeCreated.put( serviceId, false); - allSupportingServicesCreated = false; - } + + + if ( vars.getOutParams().get(serviceId) != null && vars.getOutParams().get(serviceId).get("_CREATESERVICEREF_") !=null) { + + if ( vars.getOutParams().get(serviceId).get("_CREATESERVICEREF_").equals( "true") ) { + vars.getOutParams().get(serviceId).remove( "_CREATESERVICEREF_" ); + HashMap<String, String> myChars = new HashMap< String , String >( vars.getOutParams().get(serviceId) ); + tobeCreated.put( serviceId, myChars ); + } else { + tobeCreated.remove( serviceId); + allSupportingServicesCreated = false; + } + } + } } + + + //now compare those to be created, with those already created + for ( ServiceRef serviceRef: contextService.getSupportingService() ) { + Service theServiceReferenced = serviceOrderManager.retrieveService( serviceRef.getId() ); + if ( tobeCreated.containsKey(theServiceReferenced.getServiceSpecificationRef().getId() ) ) { + tobeCreated.remove( theServiceReferenced.getServiceSpecificationRef().getId()); + } + + if ( theServiceReferenced != null ) { + if ( theServiceReferenced.getState().equals( ServiceStateType.RESERVED) ) { + foundCreatedButNOTACTIVEServices = true; + } + } + + } + serviceOrderManager.updateService( contextService.getId() , supd, false); //update context service List<String> servicesToCreate = new ArrayList<>(); for (String specid : tobeCreated.keySet()) { - if ( tobeCreated.get(specid) ) { + if ( tobeCreated.get(specid) !=null ) { servicesToCreate.add(specid); allSupportingServicesCreated = false; } @@ -161,11 +178,21 @@ public class ProcessCreateServiceRules implements JavaDelegate { } + if ( contextService.getState().equals( ServiceStateType.INACTIVE ) || contextService.getState().equals( ServiceStateType.TERMINATED ) ) { + allSupportingServicesCreatedAndActive = true; + allSupportingServicesCreated = true; + // this will help us to avoid a deadlock if a failure occurs + } + execution.setVariable("allSupportingServicesCreated", allSupportingServicesCreated ); execution.setVariable("allSupportingServicesCreatedAndActive", allSupportingServicesCreatedAndActive && allSupportingServicesCreated ); //by default execution.setVariable("parentServiceId", contextServiceId); - execution.setVariable("serviceSpecsToCreate", servicesToCreate); + execution.setVariable("serviceSpecsToCreate", servicesToCreate); + execution.setVariable("serviceSpecsToCreateInitialCharValues", tobeCreated); + + + }