diff options
Diffstat (limited to 'bpmn/so-bpmn-tasks/src/main/java')
90 files changed, 11309 insertions, 0 deletions
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/buildingblock/SniroHomingV2.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/buildingblock/SniroHomingV2.java new file mode 100644 index 0000000000..b7f45c05b5 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/buildingblock/SniroHomingV2.java @@ -0,0 +1,563 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.buildingblock; + +import static org.apache.commons.lang3.StringUtils.*; + +import java.time.Duration; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.apache.commons.lang.SerializationUtils; +import org.camunda.bpm.engine.delegate.BpmnError; +import org.json.JSONArray; +import org.json.JSONObject; +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.core.json.JsonUtils; +import org.onap.so.bpmn.servicedecomposition.bbobjects.AllottedResource; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Pnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceProxy; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VpnBondingLink; +import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock; +import org.onap.so.bpmn.servicedecomposition.generalobjects.License; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestParameters; +import org.onap.so.bpmn.servicedecomposition.homingobjects.Candidate; +import org.onap.so.bpmn.servicedecomposition.homingobjects.CandidateType; +import org.onap.so.bpmn.servicedecomposition.homingobjects.SolutionCandidates; +import org.onap.so.bpmn.servicedecomposition.homingobjects.SolutionInfo; +import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoMetadata; +import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoServiceInstance; +import org.onap.so.client.exception.BadResponseException; +import org.onap.so.client.exception.ExceptionBuilder; + +import org.onap.so.client.sniro.SniroClient; +import static org.onap.so.client.sniro.SniroValidator.*; + +import org.onap.so.client.sniro.beans.SniroManagerRequest; +import org.onap.so.db.catalog.beans.OrchestrationStatus; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; +import org.springframework.web.util.UriUtils; + + +/** + * The sniro homing building block obtains licensing and homing solutions for a given + * resource or set of resources. + * + * @author cb645j + * + */ +@Component("SniroHoming") +public class SniroHomingV2 { + private static final MsoLogger log = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, SniroHomingV2.class); + private JsonUtils jsonUtils = new JsonUtils(); + @Autowired + private Environment env; + @Autowired + private SniroClient client; + @Autowired + private ExceptionBuilder exceptionUtil; + private static final String MODEL_NAME = "modelName"; + private static final String MODEL_INVARIANT_ID = "modelInvariantId"; + private static final String MODEL_VERSION_ID = "modelVersionId"; + private static final String MODEL_VERSION = "modelVersion"; + private static final String SERVICE_RESOURCE_ID = "serviceResourceId"; + private static final String RESOURCE_MODULE_NAME = "resourceModuleName"; + private static final String RESOURCE_MODEL_INFO = "resourceModelInfo"; + private static final String IDENTIFIER_TYPE = "identifierType"; + private static final String INVENTORY_TYPE = "inventoryType"; + private static final String SOLUTIONS = "solutions"; + private static final String RESOURCE_MISSING_DATA = "Resource does not contain: "; + private static final String SERVICE_MISSING_DATA = "Service Instance does not contain: "; + private static final String UNPROCESSABLE = "422"; + private static final int INTERNAL = 500; + + /** + * Generates the request payload then sends to sniro manager to perform homing and + * licensing for the provided demands + * + * @param execution + */ + public void callSniro(BuildingBlockExecution execution){ + log.trace("Started Sniro Homing Call Sniro"); + try{ + GeneralBuildingBlock bb = execution.getGeneralBuildingBlock(); + + RequestContext requestContext = bb.getRequestContext(); + RequestParameters requestParams = requestContext.getRequestParameters(); + String requestId = requestContext.getMsoRequestId(); + + ServiceInstance serviceInstance = bb.getCustomer().getServiceSubscription().getServiceInstances().get(0); + Customer customer = bb.getCustomer(); + + String timeout = execution.getVariable("timeout"); + if(isBlank(timeout)){ + timeout = env.getProperty("sniro.manager.timeout", "PT30M"); + } + + SniroManagerRequest request = new SniroManagerRequest(); //TODO Add additional pojos for each section + + JSONObject requestInfo = buildRequestInfo(requestId, timeout); + request.setRequestInformation(requestInfo.toString()); + + JSONObject serviceInfo = buildServiceInfo(serviceInstance); + request.setServiceInformation(serviceInfo.toString()); + + JSONObject placementInfo = buildPlacementInfo(customer, requestParams); + + JSONArray placementDemands = buildPlacementDemands(serviceInstance); + placementInfo.put("placementDemands", placementDemands); + request.setPlacementInformation(placementInfo.toString()); + + JSONArray licenseDemands = buildLicenseDemands(serviceInstance); + request.setLicenseInformation(licenseDemands.toString()); + + if(placementDemands.length() > 0 || licenseDemands.length() > 0){ + client.postDemands(request); + }else{ + log.debug(SERVICE_MISSING_DATA + "resources eligible for homing or licensing"); + throw new BpmnError(UNPROCESSABLE, SERVICE_MISSING_DATA + "resources eligible for homing or licensing"); + } + + //Variables for ReceiveWorkflowMessage subflow + execution.setVariable("asyncCorrelator", requestId); + execution.setVariable("asyncMessageType", "SNIROResponse"); + execution.setVariable("asyncTimeout", timeout); + + log.trace("Completed Sniro Homing Call Sniro"); + }catch(BpmnError e){ + exceptionUtil.buildAndThrowWorkflowException(execution, Integer.parseInt(e.getErrorCode()), e.getMessage()); + }catch(BadResponseException e){ + exceptionUtil.buildAndThrowWorkflowException(execution, 400, e.getMessage()); + }catch(Exception e){ + exceptionUtil.buildAndThrowWorkflowException(execution, INTERNAL, "Internal Error - occurred while preparing sniro request: " + e.getMessage()); + } + } + + /** + * Validates, processes, and sets the homing and licensing solutions that are returned by + * sniro manager + * + * @param execution + * @param asyncResponse + */ + public void processSolution(BuildingBlockExecution execution, String asyncResponse){ + log.trace("Started Sniro Homing Process Solution"); + try{ + //TODO improve handling multiple solutions but is dependent on sniro enhancing api + work with sniro conductor to improve "inventoryType" representation + validateSolution(asyncResponse); + ServiceInstance serviceInstance = execution.getGeneralBuildingBlock().getCustomer().getServiceSubscription().getServiceInstances().get(0); + + log.debug("Processing sniro manager asyncronous response"); + JSONObject response = new JSONObject(asyncResponse); + if(response.has(SOLUTIONS)){ + JSONObject allSolutions = response.getJSONObject(SOLUTIONS); + if(allSolutions.has("placementSolutions")){ + JSONArray placementSolutions = allSolutions.getJSONArray("placementSolutions"); + for(int i = 0; i < placementSolutions.length(); i++){ + JSONArray placements = placementSolutions.getJSONArray(i); + processPlacementSolution(serviceInstance, placements, i); + } + } + if(allSolutions.has("licenseSolutions")){ + JSONArray licenseSolutions = allSolutions.getJSONArray("licenseSolutions"); + if(licenseSolutions.length() > 0){ + processLicenseSolution(serviceInstance, licenseSolutions); + } + } + }else{ + throw new BpmnError(UNPROCESSABLE, "Sniro Managers response does not contain: " + SOLUTIONS); + } + + execution.setVariable("generalBuildingBlock", execution.getGeneralBuildingBlock()); + + log.trace("Completed Sniro Homing Process Solution"); + }catch(BpmnError e){ + exceptionUtil.buildAndThrowWorkflowException(execution, Integer.parseInt(e.getErrorCode()), e.getMessage()); + }catch(BadResponseException e){ + exceptionUtil.buildAndThrowWorkflowException(execution, 400, e.getMessage()); + }catch(Exception e){ + exceptionUtil.buildAndThrowWorkflowException(execution, INTERNAL, "Internal Error - occurred while processing sniro asynchronous response: " + e.getMessage()); + } + } + + /** + * Builds the request information section for the homing/licensing request + * + * @throws Exception + */ + private JSONObject buildRequestInfo(String requestId, String timeout) throws Exception{ + log.trace("Building request information"); + JSONObject requestInfo = new JSONObject(); + if(requestId != null){ + String host = env.getProperty("mso.workflow.message.endpoint"); + String callbackUrl = host + "/" + UriUtils.encodePathSegment("SNIROResponse", "UTF-8") + "/" + UriUtils.encodePathSegment(requestId, "UTF-8"); + + Duration d = Duration.parse(timeout); + long timeoutSeconds = d.getSeconds(); + + requestInfo.put("transactionId", requestId).put("requestId", requestId).put("callbackUrl", callbackUrl).put("sourceId", "mso").put("requestType", "create") + .put("timeout", timeoutSeconds); + } else{ + throw new BpmnError(UNPROCESSABLE, "Request Context does not contain: requestId"); + } + return requestInfo; + } + + /** + * Builds the request information section for the homing/licensing request + * + */ + private JSONObject buildServiceInfo(ServiceInstance serviceInstance){ + log.trace("Building service information"); + JSONObject info = new JSONObject(); + ModelInfoServiceInstance modelInfo = serviceInstance.getModelInfoServiceInstance(); + if(isNotBlank(modelInfo.getModelInvariantUuid()) && isNotBlank(modelInfo.getModelUuid())){ + info.put("serviceInstanceId", serviceInstance.getServiceInstanceId()); + if(modelInfo.getServiceType() != null){ //temp solution + info.put("serviceName", serviceInstance.getModelInfoServiceInstance().getServiceType()); + } + info.put("modelInfo", buildModelInfo(serviceInstance.getModelInfoServiceInstance())); + }else{ + throw new BpmnError(UNPROCESSABLE, SERVICE_MISSING_DATA + MODEL_VERSION_ID + ", " + MODEL_INVARIANT_ID); + } + return info; + } + + /** + * Builds initial section of placement info for the homing/licensing request + * + */ + private JSONObject buildPlacementInfo(Customer customer, RequestParameters requestParams){ + JSONObject placementInfo = new JSONObject(); + if(customer != null){ + log.debug("Adding subscriber to placement information"); + placementInfo.put("subscriberInfo", new JSONObject().put("globalSubscriberId", customer.getGlobalCustomerId()).put("subscriberName", customer.getSubscriberName()).put("subscriberCommonSiteId", customer.getSubscriberCommonSiteId())); + if(requestParams != null){ + log.debug("Adding request parameters to placement information"); + placementInfo.put("requestParameters", new JSONObject(requestParams.toJsonString())); + } + }else{ + throw new BpmnError(UNPROCESSABLE, SERVICE_MISSING_DATA + "customer"); + } + return placementInfo; + + } + + /** + * Builds the placement demand list for the homing/licensing request + * + */ + private JSONArray buildPlacementDemands(ServiceInstance serviceInstance){ + log.trace("Building placement information demands"); + JSONArray placementDemands = new JSONArray(); + + List<AllottedResource> allottedResourceList = serviceInstance.getAllottedResources(); + if(!allottedResourceList.isEmpty()){ + log.debug("Adding allotted resources to placement demands list"); + for(AllottedResource ar : allottedResourceList){ + if(isBlank(ar.getId())){ + ar.setId(UUID.randomUUID().toString()); + } + JSONObject demand = buildDemand(ar.getId(), ar.getModelInfoAllottedResource()); + addCandidates(ar, demand); + placementDemands.put(demand); + } + } + List<VpnBondingLink> vpnBondingLinkList = serviceInstance.getVpnBondingLinks(); + if(!vpnBondingLinkList.isEmpty()){ + log.debug("Adding vpn bonding links to placement demands list"); + for(VpnBondingLink vbl:vpnBondingLinkList){ + List<ServiceProxy> serviceProxyList = vbl.getServiceProxies(); + for(ServiceProxy sp : serviceProxyList){ + if(isBlank(sp.getId())){ + sp.setId(UUID.randomUUID().toString()); + } + JSONObject demand = buildDemand(sp.getId(), sp.getModelInfoServiceProxy()); + addCandidates(sp, demand); + placementDemands.put(demand); + } + } + } + return placementDemands; + } + + /** + * Builds the license demand list for the homing/licensing request + * + */ + private JSONArray buildLicenseDemands(ServiceInstance serviceInstance){ + log.trace("Building license information"); + JSONArray licenseDemands = new JSONArray(); + List<GenericVnf> vnfList = serviceInstance.getVnfs(); + if(!vnfList.isEmpty()){ + log.debug("Adding vnfs to license demands list"); + for(GenericVnf vnf : vnfList){ + JSONObject demand = buildDemand(vnf.getVnfId(), vnf.getModelInfoGenericVnf()); + licenseDemands.put(demand); + } + } + return licenseDemands; + } + + /** + * Builds a single demand object + * + */ + private JSONObject buildDemand(String id, ModelInfoMetadata metadata){ + log.debug("Building demand for service or resource: " + id); + JSONObject demand = new JSONObject(); + if(isNotBlank(id) && isNotBlank(metadata.getModelInstanceName())){ + demand.put(SERVICE_RESOURCE_ID, id); + demand.put(RESOURCE_MODULE_NAME, metadata.getModelInstanceName()); + demand.put(RESOURCE_MODEL_INFO, buildModelInfo(metadata)); + }else{ + throw new BpmnError(UNPROCESSABLE, RESOURCE_MISSING_DATA + "modelInstanceName"); + } + return demand; + } + + /** + * Builds the resource model info section + * + */ + private JSONObject buildModelInfo(ModelInfoMetadata metadata){ + JSONObject object = new JSONObject(); + String invariantUuid = metadata.getModelInvariantUuid(); + String modelUuid = metadata.getModelUuid(); + if(isNotBlank(invariantUuid) && isNotBlank(modelUuid)){ + object.put(MODEL_INVARIANT_ID, invariantUuid).put(MODEL_VERSION_ID, modelUuid).put(MODEL_NAME, metadata.getModelName()).put(MODEL_VERSION, metadata.getModelVersion()); + }else if(isNotBlank(invariantUuid)){ + throw new BpmnError(UNPROCESSABLE, RESOURCE_MISSING_DATA + MODEL_VERSION_ID); + }else{ + throw new BpmnError(UNPROCESSABLE, RESOURCE_MISSING_DATA + MODEL_INVARIANT_ID); + } + return object; + } + + /** + * Adds required, excluded, and existing candidates to a demand + * + */ + private void addCandidates(SolutionCandidates candidates, JSONObject demand){ + List<Candidate> required = candidates.getRequiredCandidates(); + List<Candidate> excluded = candidates.getExcludedCandidates(); + if(!required.isEmpty()){ + demand.put("requiredCandidates", required); + } + if(!excluded.isEmpty()){ + demand.put("excludedCandidates", excluded); + } + //TODO support existing candidates + } + + /** + * Processes the license solutions and sets to the corresponding generic vnf + * + */ + private void processLicenseSolution(ServiceInstance serviceInstance, JSONArray licenseSolutions){ + List<GenericVnf> vnfs = serviceInstance.getVnfs(); + + log.debug("Processing the license solution"); + for(int i = 0; i < licenseSolutions.length(); i++){ + JSONObject licenseSolution = licenseSolutions.getJSONObject(i); + for(GenericVnf vnf:vnfs){ + if(licenseSolution.getString(SERVICE_RESOURCE_ID).equals(vnf.getVnfId())){ + License license = new License(); + JSONArray entitlementPools = licenseSolution.getJSONArray("entitlementPoolUUID"); + List<String> entitlementPoolsList = jsonUtils.StringArrayToList(entitlementPools); + license.setEntitlementPoolUuids(entitlementPoolsList); + JSONArray licenseKeys = licenseSolution.getJSONArray("licenseKeyGroupUUID"); + List<String> licenseKeysList = jsonUtils.StringArrayToList(licenseKeys); + license.setLicenseKeyGroupUuids(licenseKeysList); + + vnf.setLicense(license); + } + } + } + } + + /** + * Processes a placement solution list then correlates and sets each placement solution + * to its corresponding resource + * + */ + private void processPlacementSolution(ServiceInstance serviceInstance, JSONArray placements, int i){ + List<VpnBondingLink> links = serviceInstance.getVpnBondingLinks(); + List<AllottedResource> allottes = serviceInstance.getAllottedResources(); + List<GenericVnf> vnfs = serviceInstance.getVnfs(); + + log.debug("Processing placement solution " + i+1); + for(int p = 0; p < placements.length(); p++){ + JSONObject placement = placements.getJSONObject(p); + SolutionInfo solutionInfo = new SolutionInfo(); + solutionInfo.setSolutionId(i + 1); + search: { + for(VpnBondingLink vbl:links){ + List<ServiceProxy> proxies = vbl.getServiceProxies(); + for(ServiceProxy sp:proxies){ + if(placement.getString(SERVICE_RESOURCE_ID).equals(sp.getId())){ + if(i > 0){ + if(p % 2 == 0){ + VpnBondingLink vblNew = (VpnBondingLink) SerializationUtils.clone(vbl); + vblNew.setVpnBondingLinkId(UUID.randomUUID().toString()); + links.add(vblNew); + } + links.get(links.size() - 1).getServiceProxy(sp.getId()).setServiceInstance(setSolution(solutionInfo, placement)); + }else{ + sp.setServiceInstance(setSolution(solutionInfo, placement)); + } + break search; + } + } + } + for(AllottedResource ar:allottes){ + if(placement.getString(SERVICE_RESOURCE_ID).equals(ar.getId())){ + ar.setParentServiceInstance(setSolution(solutionInfo, placement)); + break search; + } + } + for(GenericVnf vnf:vnfs){ + if(placement.getString(SERVICE_RESOURCE_ID).equals(vnf.getVnfId())){ + ServiceInstance si = setSolution(solutionInfo, placement); + serviceInstance.setSolutionInfo(si.getSolutionInfo()); + serviceInstance.getVnfs().add(si.getVnfs().get(0)); + break search; + } + } + } + } + } + + + /** + * Creates and sets necessary pojos with placement solution data for a given demand + * + */ + private ServiceInstance setSolution(SolutionInfo solutionInfo, JSONObject placement){ + log.debug("Mapping placement solution"); + String invalidMessage = "Sniro Managers Response contains invalid: "; + + JSONObject solution = placement.getJSONObject("solution"); + String identifierType = solution.getString(IDENTIFIER_TYPE); + List<String> identifiersList = jsonUtils.StringArrayToList(solution.getJSONArray("identifiers").toString()); + String identifierValue = identifiersList.get(0); + + JSONArray assignments = placement.getJSONArray("assignmentInfo"); + Map<String, String> assignmentsMap = jsonUtils.entryArrayToMap(assignments.toString(), "key", "value"); + solutionInfo.setRehome(Boolean.parseBoolean(assignmentsMap.get("isRehome"))); + String type = placement.getString(INVENTORY_TYPE); + + ServiceInstance si = new ServiceInstance(); + CloudRegion cloud = setCloud(assignmentsMap); + if(type.equals("service")){ + if(identifierType.equals(CandidateType.SERVICE_INSTANCE_ID.toString())){ + solutionInfo.setHomed(true); + si.setServiceInstanceId(identifierValue); + si.setOrchestrationStatus(OrchestrationStatus.CREATED); + cloud.setLcpCloudRegionId(assignmentsMap.get("cloudRegionId")); + if(assignmentsMap.containsKey("vnfHostName")){ + log.debug("Resources has been homed to a vnf"); + GenericVnf vnf = setVnf(assignmentsMap); + vnf.setCloudRegion(cloud); + si.getVnfs().add(vnf); + + }else if(assignmentsMap.containsKey("primaryPnfName")){ + log.debug("Resources has been homed to a pnf"); + Pnf priPnf = setPnf(assignmentsMap, "primary"); + priPnf.setCloudRegion(cloud); + si.getPnfs().add(priPnf); + if(assignmentsMap.containsKey("secondaryPnfName")){ + Pnf secPnf = setPnf(assignmentsMap, "secondary"); + secPnf.setCloudRegion(cloud); + si.getPnfs().add(secPnf); + } + } + }else{ + log.debug(invalidMessage + IDENTIFIER_TYPE); + throw new BpmnError(UNPROCESSABLE, invalidMessage + IDENTIFIER_TYPE); + } + }else if(type.equals("cloud")){ + if(identifierType.equals(CandidateType.CLOUD_REGION_ID.toString())){ + log.debug("Resources has been homed to a cloud region"); + cloud.setLcpCloudRegionId(identifierValue); + solutionInfo.setHomed(false); + solutionInfo.setTargetedCloudRegion(cloud); + si.setOrchestrationStatus(OrchestrationStatus.PRECREATED); + }else{ + log.debug(invalidMessage + IDENTIFIER_TYPE); + throw new BpmnError(UNPROCESSABLE, invalidMessage + IDENTIFIER_TYPE); + } + }else{ + log.debug(invalidMessage + INVENTORY_TYPE); + throw new BpmnError(UNPROCESSABLE, invalidMessage + INVENTORY_TYPE); + } + si.setSolutionInfo(solutionInfo); + return si; + } + + /** + * Sets the cloud data to a cloud region object + * + */ + private CloudRegion setCloud(Map<String, String> assignmentsMap){ + CloudRegion cloud = new CloudRegion(); + cloud.setCloudOwner(assignmentsMap.get("cloudOwner")); + cloud.setCloudRegionVersion(assignmentsMap.get("aicVersion")); + cloud.setComplex(assignmentsMap.get("aicClli")); + return cloud; + } + + /** + * Sets the vnf data to a generic vnf object + * + */ + private GenericVnf setVnf(Map<String, String> assignmentsMap){ + GenericVnf vnf = new GenericVnf(); + vnf.setOrchestrationStatus(OrchestrationStatus.CREATED); + vnf.setVnfName(assignmentsMap.get("vnfHostName")); + vnf.setVnfId(assignmentsMap.get("vnfId")); + return vnf; + } + + /** + * Sets the pnf data to a pnf object + * + */ + private Pnf setPnf(Map<String, String> assignmentsMap, String role){ + Pnf pnf = new Pnf(); + pnf.setRole(role); + pnf.setOrchestrationStatus(OrchestrationStatus.CREATED); + pnf.setPnfName(assignmentsMap.get(role + "PnfName")); + return pnf; + } + + + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICommonTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICommonTasks.java new file mode 100644 index 0000000000..6571971347 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICommonTasks.java @@ -0,0 +1,56 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.aai.tasks; + +import java.util.Optional; + +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoServiceInstance; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.ExceptionBuilder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class AAICommonTasks { + + @Autowired + private ExceptionBuilder exceptionUtil; + @Autowired + private ExtractPojosForBB extractPojosForBB; + + public Optional<String> getServiceType(BuildingBlockExecution execution) { + try { + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + + ModelInfoServiceInstance model = serviceInstance.getModelInfoServiceInstance(); + if (model != null) { + return Optional.of(model.getServiceType()); + } + } catch(Exception e) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, e); + } + return Optional.empty(); + } + +}
\ No newline at end of file diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICreateTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICreateTasks.java new file mode 100644 index 0000000000..79613047e5 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICreateTasks.java @@ -0,0 +1,379 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.aai.tasks; + +import org.camunda.bpm.engine.delegate.BpmnError; +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Collection; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.InstanceGroup; +import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network; +import org.onap.so.bpmn.servicedecomposition.bbobjects.LineOfBusiness; +import org.onap.so.bpmn.servicedecomposition.bbobjects.OwningEntity; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Platform; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Project; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup; +import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.BBObjectNotFoundException; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.client.orchestration.AAINetworkResources; +import org.onap.so.client.orchestration.AAIServiceInstanceResources; +import org.onap.so.client.orchestration.AAIVfModuleResources; +import org.onap.so.client.orchestration.AAIVnfResources; +import org.onap.so.client.orchestration.AAIVolumeGroupResources; +import org.onap.so.client.orchestration.AAIVpnBindingResources; +import org.onap.so.db.catalog.beans.OrchestrationStatus; +import org.onap.so.logger.MessageEnum; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class AAICreateTasks { + + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, AAICreateTasks.class); + private static final String networkTypeProvider = "PROVIDER"; + private static String NETWORK_COLLECTION_NAME = "networkCollectionName"; + @Autowired + private AAIServiceInstanceResources aaiSIResources; + @Autowired + private AAIVnfResources aaiVnfResources; + @Autowired + private ExceptionBuilder exceptionUtil; + @Autowired + private ExtractPojosForBB extractPojosForBB; + @Autowired + private AAIVolumeGroupResources aaiVolumeGroupResources; + @Autowired + private AAIVfModuleResources aaiVfModuleResources; + @Autowired + private AAINetworkResources aaiNetworkResources; + @Autowired + private AAIVpnBindingResources aaiVpnBindingResources; + + public void createServiceInstance(BuildingBlockExecution execution) { + try { + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + Customer customer = execution.getGeneralBuildingBlock().getCustomer(); + aaiSIResources.createServiceInstance(serviceInstance, customer); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void createServiceSubscription(BuildingBlockExecution execution){ + try{ + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, + ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + Customer customer = execution.getGeneralBuildingBlock().getCustomer(); + if (null == customer) { + String errorMessage = "Exception in creating ServiceSubscription. Customer not present for ServiceInstanceID: " + + serviceInstance.getServiceInstanceId(); + msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, errorMessage, "BPMN", MsoLogger.getServiceName(), + MsoLogger.ErrorCode.UnknownError, errorMessage); + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, errorMessage); + } + aaiSIResources.createServiceSubscription(customer); + } catch (BpmnError ex) { + throw ex; + } + catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void createProject(BuildingBlockExecution execution) { + try { + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + Project project = serviceInstance.getProject(); + if(project != null) { + if (project.getProjectName() == null || "".equals(project.getProjectName())) { + msoLogger.info("ProjectName is null in input. Skipping create project..."); + } else { + aaiSIResources.createProjectandConnectServiceInstance(project, serviceInstance); + } + } + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void createOwningEntity(BuildingBlockExecution execution) { + try { + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + OwningEntity owningEntity = serviceInstance.getOwningEntity(); + String owningEntityId = owningEntity.getOwningEntityId(); + String owningEntityName = owningEntity.getOwningEntityName(); + if (owningEntityId == null || "".equals(owningEntityId)) { + String msg = "Exception in AAICreateOwningEntity. OwningEntityId is null."; + execution.setVariable("ErrorCreateOEAAI", msg); + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg); + } else { + if (aaiSIResources.existsOwningEntity(owningEntity)) { + aaiSIResources.connectOwningEntityandServiceInstance(owningEntity, serviceInstance); + } else { + if (owningEntityName == null || "".equals(owningEntityName)) { + String msg = "Exception in AAICreateOwningEntity. Can't create an owningEntity with no owningEntityName."; + msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, msg, "BPMN", MsoLogger.getServiceName(), + MsoLogger.ErrorCode.UnknownError, msg); + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg); + } else { + if(aaiSIResources.existsOwningEntityName(owningEntityName)){ + String msg = "Exception in AAICreateOwningEntity. Can't create OwningEntity as name already exists in AAI associated with a different owning-entity-id (name must be unique)"; + msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, msg, "BPMN", MsoLogger.getServiceName(), + MsoLogger.ErrorCode.UnknownError, msg); + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg); + }else{ + aaiSIResources.createOwningEntityandConnectServiceInstance(owningEntity, serviceInstance); + } + } + } + } + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void createVnf(BuildingBlockExecution execution) { + try { + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + execution.setVariable("callHoming", vnf.isCallHoming()); + aaiVnfResources.createVnfandConnectServiceInstance(vnf, serviceInstance); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void createPlatform(BuildingBlockExecution execution) { + try { + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + Platform platform = vnf.getPlatform(); + if(platform != null) { + if (platform.getPlatformName() == null || "".equals(platform.getPlatformName())) { + msoLogger.debug("PlatformName is null in input. Skipping create platform..."); + } else { + aaiVnfResources.createPlatformandConnectVnf(platform,vnf); + } + } + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + + } + + public void createLineOfBusiness(BuildingBlockExecution execution) { + try { + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + LineOfBusiness lineOfBusiness = vnf.getLineOfBusiness(); + if(lineOfBusiness != null) { + if (lineOfBusiness.getLineOfBusinessName() == null || "".equals(lineOfBusiness.getLineOfBusinessName())) { + msoLogger.info("lineOfBusiness is null in input. Skipping create lineOfBusiness..."); + } else { + aaiVnfResources.createLineOfBusinessandConnectVnf(lineOfBusiness,vnf); + } + } + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void createVolumeGroup(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + + GenericVnf genericVnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + VolumeGroup volumeGroup = extractPojosForBB.extractByKey(execution, ResourceKey.VOLUME_GROUP_ID, execution.getLookupMap().get(ResourceKey.VOLUME_GROUP_ID)); + CloudRegion cloudRegion = gBBInput.getCloudRegion(); + aaiVolumeGroupResources.createVolumeGroup(volumeGroup, cloudRegion); + aaiVolumeGroupResources.connectVolumeGroupToVnf(genericVnf, volumeGroup, cloudRegion); + aaiVolumeGroupResources.connectVolumeGroupToTenant(volumeGroup,cloudRegion); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void createVfModule(BuildingBlockExecution execution) { + try { + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + aaiVfModuleResources.createVfModule(vfModule, vnf); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to establish relationships in AAI + * @param execution + * @throws Exception + */ + public void connectVfModuleToVolumeGroup(BuildingBlockExecution execution) { + try { + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + VolumeGroup volumeGroup = null; + try{ + volumeGroup = extractPojosForBB.extractByKey(execution, ResourceKey.VOLUME_GROUP_ID, execution.getLookupMap().get(ResourceKey.VOLUME_GROUP_ID)); + } catch (BBObjectNotFoundException e){ + msoLogger.info("VolumeGroup not found. Skipping Connect between VfModule and VolumeGroup"); + } + if (volumeGroup != null) { + aaiVfModuleResources.connectVfModuleToVolumeGroup(vnf, vfModule, volumeGroup, execution.getGeneralBuildingBlock().getCloudRegion()); + } + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to execute Create L3Network operation (PUT )in AAI + * @param execution + * @throws Exception + */ + public void createNetwork(BuildingBlockExecution execution) { + try { + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + //set default to false. ToBe updated by SDNC + l3network.setIsBoundToVpn(false); + //define is bound to vpn flag as true if NEUTRON_NETWORK_TYPE is PROVIDER + if (l3network.getModelInfoNetwork().getNeutronNetworkType().equalsIgnoreCase(networkTypeProvider)) + l3network.setIsBoundToVpn(true); + //put network shell in AAI + aaiNetworkResources.createNetworkConnectToServiceInstance(l3network, serviceInstance); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + public void createCustomer(BuildingBlockExecution execution) throws Exception { + try { + Customer customer = execution.getGeneralBuildingBlock().getCustomer(); + + aaiVpnBindingResources.createCustomer(customer); + } catch(Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to execute NetworkCollection operation (PUT) in AAI + * @param execution + * @throws Exception + */ + public void createNetworkCollection(BuildingBlockExecution execution) { + try { + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + Collection networkCollection = serviceInstance.getCollection(); + //pass name generated for NetworkCollection/NetworkCollectionInstanceGroup in previous step of the BB flow + //put shell in AAI + networkCollection.setName(execution.getVariable(NETWORK_COLLECTION_NAME)); + aaiNetworkResources.createNetworkCollection(networkCollection); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to execute NetworkCollectionInstanceGroup operation (PUT) in AAI + * @param execution + * @throws Exception + */ + public void createNetworkCollectionInstanceGroup(BuildingBlockExecution execution) { + try { + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + InstanceGroup instanceGroup = serviceInstance.getCollection().getInstanceGroup(); + //set name generated for NetworkCollection/NetworkCollectionInstanceGroup in previous step of the BB flow + instanceGroup.setInstanceGroupName(execution.getVariable(NETWORK_COLLECTION_NAME)); + //put shell in AAI + aaiNetworkResources.createNetworkInstanceGroup(instanceGroup); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + + /** + * BPMN access method to establish relationships in AAI + * @param execution + * @throws Exception + */ + public void connectNetworkToTenant(BuildingBlockExecution execution) { + try { + L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + aaiNetworkResources.connectNetworkToTenant(l3network, execution.getGeneralBuildingBlock().getCloudRegion()); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to establish relationships in AAI + * @param execution + * @throws Exception + */ + public void connectNetworkToCloudRegion(BuildingBlockExecution execution) { + try { + L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + aaiNetworkResources.connectNetworkToCloudRegion(l3network, execution.getGeneralBuildingBlock().getCloudRegion()); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to establish relationships in AAI + * @param execution + * @throws Exception + */ + public void connectNetworkToNetworkCollectionServiceInstance(BuildingBlockExecution execution) { + try { + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + aaiNetworkResources.connectNetworkToNetworkCollectionServiceInstance(l3network, serviceInstance); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to establish relationships in AAI + * @param execution + * @throws Exception + */ + public void connectNetworkToNetworkCollectionInstanceGroup(BuildingBlockExecution execution) { + try { + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + //connect network only if Instance Group / Collection objects exist + if (serviceInstance.getCollection() != null && serviceInstance.getCollection().getInstanceGroup() != null) + aaiNetworkResources.connectNetworkToNetworkCollectionInstanceGroup(l3network, serviceInstance.getCollection().getInstanceGroup()); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIDeleteTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIDeleteTasks.java new file mode 100644 index 0000000000..cb265b6e41 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIDeleteTasks.java @@ -0,0 +1,136 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.aai.tasks; + + +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.client.orchestration.AAINetworkResources; +import org.onap.so.client.orchestration.AAIServiceInstanceResources; +import org.onap.so.client.orchestration.AAIVfModuleResources; +import org.onap.so.client.orchestration.AAIVnfResources; +import org.onap.so.client.orchestration.AAIVolumeGroupResources; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class AAIDeleteTasks { + + @Autowired + private ExceptionBuilder exceptionUtil; + @Autowired + private ExtractPojosForBB extractPojosForBB; + @Autowired + private AAIServiceInstanceResources aaiSIResources; + @Autowired + private AAIVnfResources aaiVnfResources; + @Autowired + private AAIVfModuleResources aaiVfModuleResources; + @Autowired + private AAINetworkResources aaiNetworkResources; + @Autowired + private AAIVolumeGroupResources aaiVolumeGroupResources; + + public void deleteVfModule(BuildingBlockExecution execution) throws Exception { + GenericVnf genericVnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + + execution.setVariable("aaiVfModuleRollback", false); + try { + aaiVfModuleResources.deleteVfModule(vfModule, genericVnf); + execution.setVariable("aaiVfModuleRollback", true); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void deleteVnf(BuildingBlockExecution execution) throws Exception { + GenericVnf genericVnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + + execution.setVariable("aaiVnfRollback", false); + try { + aaiVnfResources.deleteVnf(genericVnf); + execution.setVariable("aaiVnfRollback", true); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void deleteServiceInstance(BuildingBlockExecution execution) throws Exception { + try { + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + aaiSIResources.deleteServiceInstance(serviceInstance); + } + catch(Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + + } + + public void deleteNetwork(BuildingBlockExecution execution) throws Exception { + try { + L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + aaiNetworkResources.deleteNetwork(l3network); + execution.setVariable("isRollbackNeeded", true); + } + catch(Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void deleteCollection(BuildingBlockExecution execution) throws Exception { + try { + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + aaiNetworkResources.deleteCollection(serviceInstance.getCollection()); + } + catch(Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void deleteInstanceGroup(BuildingBlockExecution execution) throws Exception { + try { + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + aaiNetworkResources.deleteNetworkInstanceGroup(serviceInstance.getCollection().getInstanceGroup()); + } + catch(Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void deleteVolumeGroup(BuildingBlockExecution execution) { + try { + VolumeGroup volumeGroup = extractPojosForBB.extractByKey(execution, ResourceKey.VOLUME_GROUP_ID, execution.getLookupMap().get(ResourceKey.VOLUME_GROUP_ID)); + CloudRegion cloudRegion = execution.getGeneralBuildingBlock().getCloudRegion(); + aaiVolumeGroupResources.deleteVolumeGroup(volumeGroup, cloudRegion); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIFlagTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIFlagTasks.java new file mode 100644 index 0000000000..53d0e0a45c --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIFlagTasks.java @@ -0,0 +1,74 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.aai.tasks; + +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.client.orchestration.AAIVfModuleResources; +import org.onap.so.client.orchestration.AAIVnfResources; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class AAIFlagTasks { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, AAIFlagTasks.class); + + @Autowired + private AAIVnfResources aaiVnfResources; + @Autowired + private ExceptionBuilder exceptionUtil; + @Autowired + private ExtractPojosForBB extractPojosForBB; + + public void checkVnfInMaintFlag(BuildingBlockExecution execution) { + boolean inMaint = false; + try { + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + String vnfId = vnf.getVnfId(); + inMaint = aaiVnfResources.checkInMaintFlag(vnfId); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + if (inMaint) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "VNF is in maintenance in A&AI"); + } + } + + public void modifyVnfInMaintFlag(BuildingBlockExecution execution, boolean inMaint) { + try { + GenericVnf genericVnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + + GenericVnf copiedGenericVnf = genericVnf.shallowCopyId(); + + copiedGenericVnf.setInMaint(inMaint); + genericVnf.setInMaint(inMaint); + + aaiVnfResources.updateObjectVnf(copiedGenericVnf); + } catch(Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIQueryTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIQueryTasks.java new file mode 100644 index 0000000000..beffa25249 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIQueryTasks.java @@ -0,0 +1,241 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.aai.tasks; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import org.modelmapper.ModelMapper; +import org.modelmapper.PropertyMap; +import org.onap.aai.domain.yang.NetworkPolicy; +import org.onap.aai.domain.yang.RouteTableReference; +import org.onap.aai.domain.yang.RouteTargets; +import org.onap.aai.domain.yang.VpnBinding; +import org.onap.so.adapters.nwrest.CreateNetworkRequest; +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.aai.AAIObjectType; +import org.onap.so.client.aai.entities.AAIResultWrapper; +import org.onap.so.client.aai.entities.Relationships; +import org.onap.so.client.aai.entities.uri.AAIResourceUri; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.client.orchestration.AAINetworkResources; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class AAIQueryTasks { + + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, AAIQueryTasks.class); + private static final String NETWORK_RESULT_WRAPPER_KEY = "l3NetworkAAIResultWrapper"; + private static final String ERROR_MSG = "No relationships were returned from AAIResultWrapper.getRelationships()"; + @Autowired + private ExtractPojosForBB extractPojosForBB; + @Autowired + private ExceptionBuilder exceptionUtil; + @Autowired + private AAINetworkResources aaiNetworkResources; + private static final ModelMapper modelMapper = new ModelMapper(); + + /** + * BPMN access method to query L3Network object in AAI by it's Id + * + * @param execution + * @throws Exception + */ + public void getNetworkWrapperById(BuildingBlockExecution execution) { + try { + L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, + execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + AAIResultWrapper aaiResultWrapper = aaiNetworkResources.queryNetworkWrapperById(l3network); + execution.setVariable(NETWORK_RESULT_WRAPPER_KEY, aaiResultWrapper); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to query data for VPN bindings from the AAI result wrapper. + * The resulting VPN bindings are mapped to the corresponding bbobject and placed in the customer bbobject + * + * @param execution + */ + + public void queryNetworkVpnBinding(BuildingBlockExecution execution) { + try { + org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + + AAIResultWrapper aaiResultWrapper = execution.getVariable(NETWORK_RESULT_WRAPPER_KEY); + Optional<Relationships> networkRelationships = aaiResultWrapper.getRelationships(); + if (!networkRelationships.isPresent()) { + throw (new Exception(ERROR_MSG)); + } + List<AAIResourceUri> netBindingsUriList = networkRelationships.get().getRelatedAAIUris(AAIObjectType.VPN_BINDING); + + List<org.onap.so.bpmn.servicedecomposition.bbobjects.VpnBinding> mappedVpnBindings = new ArrayList<>(); + if(netBindingsUriList != null && !netBindingsUriList.isEmpty()) { + for(AAIResourceUri netBindingUri : netBindingsUriList) { + Optional<VpnBinding> oVpnBinding = aaiNetworkResources.getVpnBinding(netBindingUri); + if(oVpnBinding.isPresent()) { + org.onap.so.bpmn.servicedecomposition.bbobjects.VpnBinding mappedVpnBinding = + modelMapper.map(oVpnBinding.get(), org.onap.so.bpmn.servicedecomposition.bbobjects.VpnBinding.class); + if (oVpnBinding.get().getRouteTargets() != null){ + mappedVpnBinding.getRouteTargets().addAll(mapRouteTargets(oVpnBinding.get().getRouteTargets().getRouteTarget())); + mappedVpnBindings.add(mappedVpnBinding); + } + } + } + } + execution.getGeneralBuildingBlock().getCustomer().getVpnBindings().addAll(mappedVpnBindings); + } catch(Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to extract VPN Binding data from AAI result and populate proper fields into CreateNetworkRequest + */ + public void getNetworkVpnBinding(BuildingBlockExecution execution) { + + try { + AAIResultWrapper aaiResultWrapper = execution.getVariable(NETWORK_RESULT_WRAPPER_KEY); + CreateNetworkRequest createNetworkRequest = execution.getVariable("createNetworkRequest"); + + Optional<Relationships> networkRelationships = aaiResultWrapper.getRelationships(); + if (!networkRelationships.isPresent()) { + throw (new Exception(ERROR_MSG)); + } + List<AAIResourceUri> netBindingsUriList = networkRelationships.get() + .getRelatedAAIUris(AAIObjectType.VPN_BINDING); + List<org.onap.so.openstack.beans.RouteTarget> routeTargets = new ArrayList<>(); + for (AAIResourceUri netBindingUri : netBindingsUriList) { + msoLogger.info("Get Route Targests"); + Optional<VpnBinding> oVpnBinding = aaiNetworkResources.getVpnBinding(netBindingUri); + if (oVpnBinding.isPresent()) { + VpnBinding vpnBinding = oVpnBinding.get(); + RouteTargets rts = vpnBinding.getRouteTargets(); + if (rts != null) { + List<org.onap.aai.domain.yang.RouteTarget> rtList = rts.getRouteTarget(); + if (!rtList.isEmpty()) { + PropertyMap<org.onap.aai.domain.yang.RouteTarget, org.onap.so.openstack.beans.RouteTarget> personMap = new PropertyMap<org.onap.aai.domain.yang.RouteTarget, org.onap.so.openstack.beans.RouteTarget>() { + @Override + protected void configure() { + map().setRouteTarget(source.getGlobalRouteTarget()); + map(source.getRouteTargetRole(), destination.getRouteTargetRole()); + } + }; + modelMapper.addMappings(personMap); + for (org.onap.aai.domain.yang.RouteTarget rt : rtList) { + org.onap.so.openstack.beans.RouteTarget openstackRtBean = modelMapper.map(rt, + org.onap.so.openstack.beans.RouteTarget.class); + routeTargets.add(openstackRtBean); + } + } + } + } + } + // store route targets data in execution - to be used as part of + // Network adapter input + createNetworkRequest.getContrailNetwork().setRouteTargets(routeTargets); + execution.setVariable("createNetworkRequest", createNetworkRequest); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to query data for network policies from the AAI result wrapper + * From the resulting network policy, the network policy fqdn parameter is added to + * the network bbobject contrail network policy fqdns list + * + * @param execution + */ + public void queryNetworkPolicy(BuildingBlockExecution execution) { + try { + L3Network l3Network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + + AAIResultWrapper aaiResultWrapper = execution.getVariable(NETWORK_RESULT_WRAPPER_KEY); + Optional<Relationships> networkRelationships = aaiResultWrapper.getRelationships(); + if (!networkRelationships.isPresent()) { + throw (new Exception(ERROR_MSG)); + } + List<AAIResourceUri> netPoliciesUriList = networkRelationships.get().getRelatedAAIUris(AAIObjectType.NETWORK_POLICY); + + if(!netPoliciesUriList.isEmpty()) { + for(AAIResourceUri netPolicyUri : netPoliciesUriList) { + Optional<NetworkPolicy> oNetPolicy = aaiNetworkResources.getNetworkPolicy(netPolicyUri); + if(oNetPolicy.isPresent()) { + l3Network.getNetworkPolicies().add(modelMapper.map(oNetPolicy.get(), org.onap.so.bpmn.servicedecomposition.bbobjects.NetworkPolicy.class)); + } + } + } + } catch(Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to query data for network table ref from the AAI result wrapper + * The resulting route table reference is mapped to the corresponding bbobject and added + * to the network bbobject contrail network route table references list + * + * @param execution + */ + public void queryNetworkTableRef(BuildingBlockExecution execution) { + try { + L3Network l3Network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + + AAIResultWrapper aaiResultWrapper = execution.getVariable(NETWORK_RESULT_WRAPPER_KEY); + Optional<Relationships> networkRelationships = aaiResultWrapper.getRelationships(); + if (!networkRelationships.isPresent()) { + throw (new Exception(ERROR_MSG)); + } + List<AAIResourceUri> routeTableUriList = networkRelationships.get().getRelatedAAIUris(AAIObjectType.ROUTE_TABLE_REFERENCE); + + if(!routeTableUriList.isEmpty()) { + for(AAIResourceUri routeTableUri : routeTableUriList) { + Optional<RouteTableReference> oRouteTableReference = aaiNetworkResources.getRouteTable(routeTableUri); + if(oRouteTableReference.isPresent()) { + org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTableReference mappedRouteTableReference = modelMapper.map(oRouteTableReference.get(), org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTableReference.class); + l3Network.getContrailNetworkRouteTableReferences().add(mappedRouteTableReference); + } + } + } + } catch(Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + private List<org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTarget> mapRouteTargets(List<org.onap.aai.domain.yang.RouteTarget> routeTargets) { + List<org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTarget> mappedRouteTargets = new ArrayList<>(); + if(!routeTargets.isEmpty()) { + for(org.onap.aai.domain.yang.RouteTarget routeTarget : routeTargets) { + org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTarget mappedRouteTarget = modelMapper.map(routeTarget, org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTarget.class); + mappedRouteTargets.add(mappedRouteTarget); + } + } + return mappedRouteTargets; + } +}
\ No newline at end of file diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasks.java new file mode 100644 index 0000000000..074652e221 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasks.java @@ -0,0 +1,370 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.aai.tasks; + +import org.onap.so.adapters.nwrest.CreateNetworkResponse; +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Collection; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup; +import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.BBObjectNotFoundException; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.client.orchestration.AAICollectionResources; +import org.onap.so.client.orchestration.AAINetworkResources; +import org.onap.so.client.orchestration.AAIServiceInstanceResources; +import org.onap.so.client.orchestration.AAIVfModuleResources; +import org.onap.so.client.orchestration.AAIVnfResources; +import org.onap.so.client.orchestration.AAIVolumeGroupResources; +import org.onap.so.db.catalog.beans.OrchestrationStatus; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class AAIUpdateTasks { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, AAIUpdateTasks.class); + @Autowired + private AAIServiceInstanceResources aaiServiceInstanceResources; + @Autowired + private AAIVnfResources aaiVnfResources; + @Autowired + private AAIVfModuleResources aaiVfModuleResources; + @Autowired + private ExceptionBuilder exceptionUtil; + @Autowired + private ExtractPojosForBB extractPojosForBB; + @Autowired + private AAIVolumeGroupResources aaiVolumeGroupResources; + @Autowired + private AAINetworkResources aaiNetworkResources; + @Autowired + private AAICollectionResources aaiCollectionResources; + + public void updateOrchestrationStatusAssignedService(BuildingBlockExecution execution) { + try { + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + aaiServiceInstanceResources.updateOrchestrationStatusServiceInstance(serviceInstance, OrchestrationStatus.ASSIGNED); + execution.setVariable("aaiServiceInstanceRollback", true); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void updateOrchestrationStatusActiveService(BuildingBlockExecution execution) { + try { + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + aaiServiceInstanceResources.updateOrchestrationStatusServiceInstance(serviceInstance, OrchestrationStatus.ACTIVE); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void updateOrchestrationStatusAssignedVnf(BuildingBlockExecution execution) { + try { + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + aaiVnfResources.updateOrchestrationStatusVnf(vnf,OrchestrationStatus.ASSIGNED); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void updateOrchestrationStatusActiveVnf(BuildingBlockExecution execution) { + try { + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + aaiVnfResources.updateOrchestrationStatusVnf(vnf,OrchestrationStatus.ACTIVE); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void updateOrchestrationStatusAssignedVolumeGroup(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + + VolumeGroup volumeGroup = extractPojosForBB.extractByKey(execution, ResourceKey.VOLUME_GROUP_ID, execution.getLookupMap().get(ResourceKey.VOLUME_GROUP_ID)); + CloudRegion cloudRegion = gBBInput.getCloudRegion(); + volumeGroup.setHeatStackId(""); + aaiVolumeGroupResources.updateOrchestrationStatusVolumeGroup(volumeGroup, cloudRegion, OrchestrationStatus.ASSIGNED); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void updateOrchestrationStatusActiveVolumeGroup(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + + VolumeGroup volumeGroup = extractPojosForBB.extractByKey(execution, ResourceKey.VOLUME_GROUP_ID, execution.getLookupMap().get(ResourceKey.VOLUME_GROUP_ID)); + CloudRegion cloudRegion = gBBInput.getCloudRegion(); + + aaiVolumeGroupResources.updateOrchestrationStatusVolumeGroup(volumeGroup, cloudRegion, OrchestrationStatus.ACTIVE); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void updateOrchestrationStatusCreatedVolumeGroup(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + + VolumeGroup volumeGroup = extractPojosForBB.extractByKey(execution, ResourceKey.VOLUME_GROUP_ID, execution.getLookupMap().get(ResourceKey.VOLUME_GROUP_ID)); + CloudRegion cloudRegion = gBBInput.getCloudRegion(); + + aaiVolumeGroupResources.updateOrchestrationStatusVolumeGroup(volumeGroup, cloudRegion, OrchestrationStatus.CREATED); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void updateOrchestrationStatusAssignedVfModule(BuildingBlockExecution execution) { + try { + VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + vfModule.setHeatStackId(""); + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + aaiVfModuleResources.updateOrchestrationStatusVfModule(vfModule,vnf,OrchestrationStatus.ASSIGNED); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void updateOrchestrationStatusPendingActivationVfModule(BuildingBlockExecution execution) { + try { + VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + aaiVfModuleResources.updateOrchestrationStatusVfModule(vfModule,vnf,OrchestrationStatus.PENDING_ACTIVATION); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void updateOrchestrationStatusCreatedVfModule(BuildingBlockExecution execution) { + try { + VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + aaiVfModuleResources.updateOrchestrationStatusVfModule(vfModule,vnf,OrchestrationStatus.CREATED); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void updateOrchestrationStatusDeactivateVfModule(BuildingBlockExecution execution) { + execution.setVariable("aaiDeactivateVfModuleRollback", false); + try { + VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + aaiVfModuleResources.updateOrchestrationStatusVfModule(vfModule,vnf,OrchestrationStatus.CREATED); + execution.setVariable("aaiDeactivateVfModuleRollback", true); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to update status of L3Network to Assigned in AAI + * @param execution + * @throws BBObjectNotFoundException + */ + public void updateOrchestrationStatusAssignedNetwork(BuildingBlockExecution execution) { + execution.setVariable("aaiNetworkAssignRollback", false); + try { + L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + L3Network copiedl3network = l3network.shallowCopyId(); + + + l3network.setOrchestrationStatus(OrchestrationStatus.ASSIGNED); + l3network.setHeatStackId(""); + + copiedl3network.setOrchestrationStatus(OrchestrationStatus.ASSIGNED); + copiedl3network.setHeatStackId(""); + aaiNetworkResources.updateNetwork(copiedl3network); + execution.setVariable("aaiNetworkAssignRollback", true); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to update status of L3Network to Active in AAI + * @param execution + * @throws BBObjectNotFoundException + */ + public void updateOrchestrationStatusActiveNetwork(BuildingBlockExecution execution) { + execution.setVariable("aaiNetworkActivateRollback", false); + try { + L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + L3Network copiedl3network = l3network.shallowCopyId(); + + copiedl3network.setOrchestrationStatus(OrchestrationStatus.ACTIVE); + l3network.setOrchestrationStatus(OrchestrationStatus.ACTIVE); + aaiNetworkResources.updateNetwork(copiedl3network); + execution.setVariable("aaiNetworkActivateRollback", true); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to update status of L3Network to Created in AAI + * @param execution + * @throws BBObjectNotFoundException + */ + public void updateOrchestrationStatusCreatedNetwork(BuildingBlockExecution execution) { + execution.setVariable("aaiNetworkActivateRollback", false); + try { + L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + L3Network copiedl3network = l3network.shallowCopyId(); + + copiedl3network.setOrchestrationStatus(OrchestrationStatus.CREATED); + l3network.setOrchestrationStatus(OrchestrationStatus.CREATED); + aaiNetworkResources.updateNetwork(copiedl3network); + execution.setVariable("aaiNetworkActivateRollback", true); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to update status of L3Network Collection to Active in AAI + * @param execution + * @throws BBObjectNotFoundException + */ + public void updateOrchestrationStatusActiveNetworkCollection(BuildingBlockExecution execution) { + execution.setVariable("aaiNetworkCollectionActivateRollback", false); + try { + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + Collection networkCollection = serviceInstance.getCollection(); + Collection copiedNetworkCollection = networkCollection.shallowCopyId(); + + networkCollection.setOrchestrationStatus(OrchestrationStatus.ACTIVE); + copiedNetworkCollection.setOrchestrationStatus(OrchestrationStatus.ACTIVE); + aaiCollectionResources.updateCollection(copiedNetworkCollection); + execution.setVariable("aaiNetworkCollectionActivateRollback", true); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void updateOrchestrationStatusActivateVfModule(BuildingBlockExecution execution) { + execution.setVariable("aaiActivateVfModuleRollback", false); + try { + VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + aaiVfModuleResources.updateOrchestrationStatusVfModule(vfModule, vnf, OrchestrationStatus.ACTIVE); + execution.setVariable("aaiActivateVfModuleRollback", true); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to update L3Network after it was created in AIC + * @param execution + * @throws Exception + */ + public void updateNetworkCreated(BuildingBlockExecution execution) throws Exception { + execution.setVariable("aaiNetworkActivateRollback", false); + L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + L3Network copiedl3network = l3network.shallowCopyId(); + CreateNetworkResponse response = execution.getVariable("createNetworkResponse"); + try { + if(response.getNetworkFqdn()!=null){ + l3network.setContrailNetworkFqdn(response.getNetworkFqdn()); + } + l3network.setOrchestrationStatus(OrchestrationStatus.CREATED); + l3network.setHeatStackId(response.getNetworkStackId()); + l3network.setNeutronNetworkId(response.getNeutronNetworkId()); + + copiedl3network.setContrailNetworkFqdn(response.getNetworkFqdn()); + copiedl3network.setOrchestrationStatus(OrchestrationStatus.CREATED); + copiedl3network.setHeatStackId(response.getNetworkStackId()); + copiedl3network.setNeutronNetworkId(response.getNeutronNetworkId()); + + aaiNetworkResources.updateNetwork(copiedl3network); + execution.setVariable("aaiNetworkActivateRollback", true); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void updateObjectNetwork(BuildingBlockExecution execution) { + try { + L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + aaiNetworkResources.updateNetwork(l3network); + } catch(Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to update ServiceInstance + * @param execution + */ + public void updateServiceInstance(BuildingBlockExecution execution) { + try { + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + aaiServiceInstanceResources.updateServiceInstance(serviceInstance); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void updateObjectVnf(BuildingBlockExecution execution) { + try { + GenericVnf genericVnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + aaiVnfResources.updateObjectVnf(genericVnf); + } catch(Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void updateOrchestrationStatusDeleteVfModule(BuildingBlockExecution execution) { + execution.setVariable("aaiDeleteVfModuleRollback", false); + try { + VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + vfModule.setHeatStackId(""); + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + + VfModule copiedVfModule = vfModule.shallowCopyId(); + copiedVfModule.setHeatStackId(""); + aaiVfModuleResources.updateOrchestrationStatusVfModule(vfModule,vnf,OrchestrationStatus.ASSIGNED); + execution.setVariable("aaiDeleteVfModuleRollback", true); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void updateModelVfModule(BuildingBlockExecution execution) { + try { + VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + aaiVfModuleResources.changeAssignVfModule(vfModule, vnf); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } +}
\ No newline at end of file diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterCreateTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterCreateTasks.java new file mode 100644 index 0000000000..bc3845d760 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterCreateTasks.java @@ -0,0 +1,95 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.adapter.network.tasks; + +import java.util.Map; +import java.util.Optional; + +import org.onap.so.adapters.nwrest.CreateNetworkResponse; +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.client.orchestration.NetworkAdapterResources; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class NetworkAdapterCreateTasks { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, NetworkAdapterCreateTasks.class); + + @Autowired + private ExtractPojosForBB extractPojosForBB; + @Autowired + private NetworkAdapterResources networkAdapterResources; + @Autowired + private ExceptionBuilder exceptionUtil; + + + + public void createNetwork(BuildingBlockExecution execution) { + execution.setVariable("networkAdapterCreateRollback", false); + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + L3Network l3Network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + + Map<String, String> userInput = gBBInput.getUserInput(); + String cloudRegionPo = execution.getVariable("cloudRegionPo"); + Optional<CreateNetworkResponse> oCreateNetworkResponse = networkAdapterResources.createNetwork(gBBInput.getRequestContext(), gBBInput.getCloudRegion(), gBBInput.getOrchContext(), serviceInstance, l3Network, userInput, cloudRegionPo, gBBInput.getCustomer()); + + if (oCreateNetworkResponse.isPresent()){ + CreateNetworkResponse createNetworkResponse = oCreateNetworkResponse.get(); + l3Network.setHeatStackId(createNetworkResponse.getNetworkStackId()); + if (createNetworkResponse.getNetworkCreated()){ + //setting rollback TRUE only if network was actually created (not a silent success OP) + execution.setVariable("createNetworkResponse", createNetworkResponse); + execution.setVariable("networkAdapterCreateRollback", true); + } + } + + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void rollbackCreateNetwork(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + L3Network l3Network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + CreateNetworkResponse createNetworkResponse = execution.getVariable("createNetworkResponse"); + + Map<String, String> userInput = gBBInput.getUserInput(); + String cloudRegionPo = execution.getVariable("cloudRegionPo"); + networkAdapterResources.rollbackCreateNetwork(gBBInput.getRequestContext(), gBBInput.getCloudRegion(), gBBInput.getOrchContext(), serviceInstance, l3Network, userInput, cloudRegionPo, createNetworkResponse); + + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterDeleteTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterDeleteTasks.java new file mode 100644 index 0000000000..0f0f73ddf1 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterDeleteTasks.java @@ -0,0 +1,69 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.adapter.network.tasks; + +import java.util.Optional; + +import org.onap.so.adapters.nwrest.DeleteNetworkResponse; +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.client.orchestration.NetworkAdapterResources; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class NetworkAdapterDeleteTasks { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, NetworkAdapterDeleteTasks.class); + + @Autowired + private ExtractPojosForBB extractPojosForBB; + @Autowired + private NetworkAdapterResources networkAdapterResources; + @Autowired + private ExceptionBuilder exceptionUtil; + + public void deleteNetwork(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + + L3Network l3Network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + + Optional<DeleteNetworkResponse> oDeleteNetworkResponse = networkAdapterResources.deleteNetwork(gBBInput.getRequestContext(), gBBInput.getCloudRegion(), serviceInstance, l3Network); + + if (oDeleteNetworkResponse.isPresent()){ + DeleteNetworkResponse deleteNetworkResponse = oDeleteNetworkResponse.get(); + if (deleteNetworkResponse.getNetworkDeleted()) { + execution.setVariable("deleteNetworkResponse", deleteNetworkResponse); + } + } + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterUpdateTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterUpdateTasks.java new file mode 100644 index 0000000000..ef2cf86f01 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterUpdateTasks.java @@ -0,0 +1,64 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.adapter.network.tasks; + +import java.util.Optional; + +import org.onap.so.adapters.nwrest.UpdateNetworkResponse; +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.client.orchestration.NetworkAdapterResources; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class NetworkAdapterUpdateTasks { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, NetworkAdapterUpdateTasks.class); + + @Autowired + private ExtractPojosForBB extractPojosForBB; + @Autowired + private NetworkAdapterResources networkAdapterResources; + @Autowired + private ExceptionBuilder exceptionUtil; + + public void updateNetwork(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + L3Network l3Network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + Optional<UpdateNetworkResponse> oUpdateNetworkResponse = networkAdapterResources.updateNetwork(gBBInput.getRequestContext(), gBBInput.getCloudRegion(), gBBInput.getOrchContext(), serviceInstance, l3Network, gBBInput.getUserInput(), gBBInput.getCustomer()); + + if(oUpdateNetworkResponse.isPresent()) { + UpdateNetworkResponse updateNetworkResponse = oUpdateNetworkResponse.get(); + execution.setVariable("NetworkAdapterUpdateNetworkResponse", updateNetworkResponse); + } + } catch(Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnf/tasks/VnfAdapterCreateTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnf/tasks/VnfAdapterCreateTasks.java new file mode 100644 index 0000000000..69fc633bbd --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnf/tasks/VnfAdapterCreateTasks.java @@ -0,0 +1,107 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.adapter.vnf.tasks; + +import org.onap.so.adapters.vnfrest.CreateVfModuleRequest; +import org.onap.so.adapters.vnfrest.CreateVolumeGroupRequest; +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup; +import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.generalobjects.OrchestrationContext; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.BBObjectNotFoundException; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.client.orchestration.VnfAdapterVfModuleResources; +import org.onap.so.client.orchestration.VnfAdapterVolumeGroupResources; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class VnfAdapterCreateTasks { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, VnfAdapterCreateTasks.class); + private static final String VNFREST_REQUEST = "VNFREST_Request"; + + @Autowired + private ExtractPojosForBB extractPojosForBB; + @Autowired + private VnfAdapterVolumeGroupResources vnfAdapterVolumeGroupResources; + @Autowired + private VnfAdapterVfModuleResources vnfAdapterVfModuleResources; + @Autowired + private ExceptionBuilder exceptionUtil; + + public void createVolumeGroupRequest(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + + ServiceInstance serviceInstance = gBBInput.getCustomer().getServiceSubscription().getServiceInstances().get(0); + + GenericVnf genericVnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + VolumeGroup volumeGroup = extractPojosForBB.extractByKey(execution, ResourceKey.VOLUME_GROUP_ID, execution.getLookupMap().get(ResourceKey.VOLUME_GROUP_ID)); + VfModule vfModule; + String sdncVfModuleQueryResponse = null; + try { + vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + if(vfModule.getSelflink() != null && !vfModule.getSelflink().isEmpty()) { + sdncVfModuleQueryResponse = execution.getVariable("SDNCQueryResponse_" + vfModule.getVfModuleId()); + } + else { + throw new Exception("Vf Module " + vfModule.getVfModuleId() + " exists in gBuildingBlock but does not have a selflink value"); + } + } catch(BBObjectNotFoundException bbException) { + // If there is not a vf module in the general building block (in aLaCarte case), we will not retrieve the SDNCQueryResponse and proceed as normal without throwing an error + } + + CreateVolumeGroupRequest createVolumeGroupRequest = vnfAdapterVolumeGroupResources.createVolumeGroupRequest(gBBInput.getRequestContext(), gBBInput.getCloudRegion(), gBBInput.getOrchContext(), serviceInstance, genericVnf, volumeGroup, sdncVfModuleQueryResponse); + execution.setVariable(VNFREST_REQUEST, createVolumeGroupRequest.toXmlString()); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + + public void createVfModule(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + + ServiceInstance serviceInstance = gBBInput.getCustomer().getServiceSubscription().getServiceInstances().get(0); + VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + GenericVnf genericVnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + CloudRegion cloudRegion = gBBInput.getCloudRegion(); + RequestContext requestContext = gBBInput.getRequestContext(); + OrchestrationContext orchestrationContext = gBBInput.getOrchContext(); + String sdncVfModuleQueryResponse = execution.getVariable("SDNCQueryResponse_" + vfModule.getVfModuleId()); + String sdncVnfQueryResponse = execution.getVariable("SDNCQueryResponse_" + genericVnf.getVnfId()); + + CreateVfModuleRequest createVfModuleRequest = vnfAdapterVfModuleResources.createVfModuleRequest(requestContext, cloudRegion, orchestrationContext, serviceInstance, genericVnf, vfModule, sdncVnfQueryResponse, sdncVfModuleQueryResponse); + execution.setVariable(VNFREST_REQUEST, createVfModuleRequest.toXmlString()); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnf/tasks/VnfAdapterDeleteTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnf/tasks/VnfAdapterDeleteTasks.java new file mode 100644 index 0000000000..6ec9007cd0 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnf/tasks/VnfAdapterDeleteTasks.java @@ -0,0 +1,81 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.adapter.vnf.tasks; + +import org.onap.so.adapters.vnfrest.DeleteVfModuleRequest; +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup; +import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.client.orchestration.VnfAdapterVfModuleResources; +import org.onap.so.client.orchestration.VnfAdapterVolumeGroupResources; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class VnfAdapterDeleteTasks { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, VnfAdapterDeleteTasks.class); + private static final String VNFREST_REQUEST = "VNFREST_Request"; + + @Autowired + private ExtractPojosForBB extractPojosForBB; + @Autowired + private VnfAdapterVolumeGroupResources vnfAdapterVolumeGroupResources; + @Autowired + private VnfAdapterVfModuleResources vnfAdapterVfModuleResources; + @Autowired + private ExceptionBuilder exceptionUtil; + + public void deleteVolumeGroup(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + VolumeGroup volumeGroup = extractPojosForBB.extractByKey(execution, ResourceKey.VOLUME_GROUP_ID, execution.getLookupMap().get(ResourceKey.VOLUME_GROUP_ID)); + + vnfAdapterVolumeGroupResources.deleteVolumeGroup(gBBInput.getRequestContext(), gBBInput.getCloudRegion(), serviceInstance, volumeGroup); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void deleteVfModule(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + GenericVnf genericVnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + + DeleteVfModuleRequest deleteVfModuleRequest = vnfAdapterVfModuleResources.deleteVfModuleRequest( gBBInput.getRequestContext(), gBBInput.getCloudRegion(), serviceInstance, genericVnf, vfModule); + execution.setVariable(VNFREST_REQUEST, deleteVfModuleRequest.toXmlString()); + execution.setVariable("deleteVfModuleRequest", "true"); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnf/tasks/VnfAdapterImpl.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnf/tasks/VnfAdapterImpl.java new file mode 100644 index 0000000000..aa865f0340 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnf/tasks/VnfAdapterImpl.java @@ -0,0 +1,126 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.adapter.vnf.tasks; + +import org.apache.commons.lang3.StringUtils; +import org.onap.so.adapters.vnfrest.CreateVfModuleResponse; +import org.onap.so.adapters.vnfrest.CreateVolumeGroupResponse; +import org.onap.so.adapters.vnfrest.DeleteVfModuleResponse; +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup; +import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.exceptions.MarshallerException; +import org.onap.so.logger.MessageEnum; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.xml.sax.InputSource; +import org.xml.sax.XMLReader; + +import javax.xml.XMLConstants; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.Unmarshaller; +import javax.xml.parsers.SAXParserFactory; +import javax.xml.transform.sax.SAXSource; +import java.io.StringReader; + +@Component +public class VnfAdapterImpl { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, VnfAdapterCreateTasks.class); + + @Autowired + private ExtractPojosForBB extractPojosForBB; + + @Autowired + private ExceptionBuilder exceptionUtil; + + public void preProcessVnfAdapter(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + + execution.setVariable("isDebugLogEnabled", "true"); + execution.setVariable("mso-request-id", gBBInput.getRequestContext().getMsoRequestId()); + execution.setVariable("mso-service-instance-id", serviceInstance.getServiceInstanceId()); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void postProcessVnfAdapter(BuildingBlockExecution execution) { + try { + String vnfAdapterResponse = execution.getVariable("vnfAdapterRestV1Response"); + if (!StringUtils.isEmpty( vnfAdapterResponse)) { + Object vnfRestResponse = unMarshal(vnfAdapterResponse); + if(vnfRestResponse instanceof CreateVfModuleResponse) { + VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + String heatStackId = ((CreateVfModuleResponse) vnfRestResponse).getVfModuleStackId(); + if(!StringUtils.isEmpty(heatStackId)) { + vfModule.setHeatStackId(heatStackId); + } + } else if(vnfRestResponse instanceof DeleteVfModuleResponse) { + VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + Boolean vfModuleDelete = ((DeleteVfModuleResponse) vnfRestResponse).getVfModuleDeleted(); + if(null!= vfModuleDelete && vfModuleDelete) { + vfModule.setHeatStackId(null); + } + } else if(vnfRestResponse instanceof CreateVolumeGroupResponse) { + VolumeGroup volumeGroup = extractPojosForBB.extractByKey(execution, ResourceKey.VOLUME_GROUP_ID, execution.getLookupMap().get(ResourceKey.VOLUME_GROUP_ID)); + String heatStackId = ((CreateVolumeGroupResponse) vnfRestResponse).getVolumeGroupStackId(); + if(!StringUtils.isEmpty(heatStackId)) { + volumeGroup.setHeatStackId(heatStackId); + }else{ + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "HeatStackId is missing from create VolumeGroup Vnf Adapter response."); + } + } + } + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + private Object unMarshal(String input) throws MarshallerException { + try { + SAXParserFactory spf = SAXParserFactory.newInstance(); + spf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + spf.setFeature("http://xml.org/sax/features/external-general-entities", false); + spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + spf.setNamespaceAware(true); + XMLReader xmlReader = spf.newSAXParser().getXMLReader(); + + JAXBContext jaxbContext = JAXBContext.newInstance(CreateVfModuleResponse.class, + CreateVolumeGroupResponse.class,DeleteVfModuleResponse.class); + Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); + + InputSource inputSource = new InputSource(new StringReader(input)); + SAXSource source = new SAXSource(xmlReader, inputSource); + return jaxbUnmarshaller.unmarshal(source); + } catch (Exception e) { + msoLogger.error(MessageEnum.GENERAL_EXCEPTION, "", "", "", MsoLogger.ErrorCode.SchemaError, e.getMessage(), e); + throw new MarshallerException("Error parsing VNF Adapter response. " + e.getMessage(), MsoLogger.ErrorCode.SchemaError.getValue(), e); + } + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/AssignNetwork.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/AssignNetwork.java new file mode 100644 index 0000000000..06c65020f5 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/AssignNetwork.java @@ -0,0 +1,93 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.flowspecific.tasks; + +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.db.catalog.beans.OrchestrationStatus; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class AssignNetwork { + + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, + AssignNetwork.class); + @Autowired + private ExceptionBuilder exceptionUtil; + @Autowired + private ExtractPojosForBB extractPojosForBB; + + /** + * Check if there are collection(s) + * @param execution + * @return boolean + */ + public boolean hasCollection(BuildingBlockExecution execution) { + boolean hasCollection = false; + try { + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, + execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + if (serviceInstance.getCollection() != null){ + hasCollection = true; + msoLogger.debug("there are collections to create"); + } + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + return hasCollection; + } + + /** + * Check if network was found by name + * @param execution + * @return + */ + public boolean networkFoundByName(BuildingBlockExecution execution) { + boolean networkFound = false; + try { + L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, + execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + + if (!OrchestrationStatus.PRECREATED.equals(l3network.getOrchestrationStatus())){ + networkFound = true; + msoLogger.debug("network found in NOT PRECREATED status"); + } + } catch (Exception ex) { + // return false if no network present + } + return networkFound; + } + + /** + * BPMN access method. Return flag if BPMN flow should skip AAI interaction + * @param execution + * @return TRUE if network collection was NOT present OR network WAS found by name + */ + public boolean skipNetworkCreationInAAI(BuildingBlockExecution execution) { + + return !hasCollection(execution) || networkFoundByName(execution); + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/AssignNetworkBBUtils.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/AssignNetworkBBUtils.java new file mode 100644 index 0000000000..6217f87420 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/AssignNetworkBBUtils.java @@ -0,0 +1,99 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.flowspecific.tasks; + +import org.camunda.bpm.engine.delegate.BpmnError; +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.client.orchestration.AAINetworkResources; +import org.onap.so.client.orchestration.SDNCNetworkResources; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class AssignNetworkBBUtils { + + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, + AssignNetworkBBUtils.class); + @Autowired + private ExceptionBuilder exceptionUtil; + @Autowired + private AAINetworkResources aaiNetworkResources; + @Autowired + private SDNCNetworkResources sdncNetworkResources; + @Autowired + private ExtractPojosForBB extractPojosForBB; + + /** + * BPMN access method. Verify if network name was provided as input to BB + * @param execution + * @return + */ + public boolean networkFoundByName(BuildingBlockExecution execution) throws Exception { + boolean found = false; + //TODO - populate logic after iTrack MSO-2143 implemented + return found; + } + + /** + * BPMN access method to extract Cloud Region data + * @param execution + * @throws Exception + */ + public void getCloudRegion(BuildingBlockExecution execution) { + try{ + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + CloudRegion cloudRegion = gBBInput.getCloudRegion(); + String cloudRegionSdnc; + String cloudRegionPo = cloudRegion.getLcpCloudRegionId(); + if (cloudRegion.getCloudRegionVersion().equalsIgnoreCase("2.5")){ + cloudRegionSdnc = "AAIAIC25"; + } else { + cloudRegionSdnc = cloudRegionPo; + } + execution.setVariable("cloudRegionPo", cloudRegionPo); + execution.setVariable("cloudRegionSdnc", cloudRegionSdnc); + }catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method. Process silent success scenario + * @param execution + */ + public void processSilentSuccess(BuildingBlockExecution execution) { + String msg = "Silent success processing network assign"; + msoLogger.info(msg); + } + + /** + * BPMN access method. Process silent success scenario + * @param execution + */ + public void failOrchestrationStatus(BuildingBlockExecution execution) { + BpmnError error = new BpmnError("Failed orchestration status verificaiton"); + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, error); + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/AssignVnf.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/AssignVnf.java new file mode 100644 index 0000000000..bf429ee4fc --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/AssignVnf.java @@ -0,0 +1,70 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.flowspecific.tasks; + +import java.util.List; + +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.infrastructure.common.name.generation.AAIObjectInstanceNameGenerator; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.InstanceGroup; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoInstanceGroup; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.client.orchestration.AAIInstanceGroupResources; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class AssignVnf { + + @Autowired + private ExceptionBuilder exceptionUtil; + @Autowired + private ExtractPojosForBB extractPojosForBB; + @Autowired + private AAIInstanceGroupResources aaiInstanceGroupResources; + @Autowired + private AAIObjectInstanceNameGenerator aaiObjectInstanceNameGenerator; + + + public void createInstanceGroups(BuildingBlockExecution execution) { + try { + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + List<InstanceGroup> instanceGroups = vnf.getInstanceGroups(); + for(InstanceGroup instanceGroup : instanceGroups) { + if(ModelInfoInstanceGroup.TYPE_VNFC.equalsIgnoreCase(instanceGroup.getModelInfoInstanceGroup().getType())) { + instanceGroup.setInstanceGroupName(aaiObjectInstanceNameGenerator.generateInstanceGroupName(instanceGroup, vnf)); + aaiInstanceGroupResources.createInstanceGroup(instanceGroup); + aaiInstanceGroupResources.connectInstanceGroupToVnf(instanceGroup, vnf); + } + else if(ModelInfoInstanceGroup.TYPE_NETWORK_INSTANCE_GROUP.equalsIgnoreCase(instanceGroup.getModelInfoInstanceGroup().getType())) { + aaiInstanceGroupResources.connectInstanceGroupToVnf(instanceGroup, vnf); + } + } + } + catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/CreateNetwork.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/CreateNetwork.java new file mode 100644 index 0000000000..08d5afcc44 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/CreateNetwork.java @@ -0,0 +1,68 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.flowspecific.tasks; + +import java.util.Map; + +import org.onap.so.adapters.nwrest.CreateNetworkRequest; +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.adapter.network.mapper.NetworkAdapterObjectMapper; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class CreateNetwork { + + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, CreateNetwork.class); + @Autowired + private ExceptionBuilder exceptionUtil; + @Autowired + private ExtractPojosForBB extractPojosForBB; + @Autowired + private NetworkAdapterObjectMapper networkAdapterObjectMapper; + + /** + * BPMN access method to build CreateNetworkRequest object + * + */ + public void buildCreateNetworkRequest(BuildingBlockExecution execution) throws Exception { + try{ + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + L3Network l3Network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + Map<String, String> userInput = gBBInput.getUserInput(); + String cloudRegionPo = execution.getVariable("cloudRegionPo"); + + CreateNetworkRequest createNetworkRequest = networkAdapterObjectMapper.createNetworkRequestMapper(gBBInput.getRequestContext(), gBBInput.getCloudRegion(), gBBInput.getOrchContext(), serviceInstance, l3Network, userInput, cloudRegionPo, gBBInput.getCustomer()); + + //set CreateNetowrkRequest object on execution to be re-used within current BB + execution.setVariable("createNetworkRequest", createNetworkRequest); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/CreateNetworkCollection.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/CreateNetworkCollection.java new file mode 100644 index 0000000000..222a5482c5 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/CreateNetworkCollection.java @@ -0,0 +1,109 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.flowspecific.tasks; + +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Collection; +import org.onap.so.bpmn.servicedecomposition.bbobjects.InstanceGroup; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.client.orchestration.AAINetworkResources; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class CreateNetworkCollection { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, CreateNetworkCollection.class); + @Autowired + private ExceptionBuilder exceptionUtil; + @Autowired + private ExtractPojosForBB extractPojosForBB; + @Autowired + private AAINetworkResources aaiNetworkResources; + + private static final String UNDERSCORE = "_"; + private static final String NETWORK_COLLECTION_NAME = "networkCollectionName"; + + /** + * BPMN access method to build Network Collection Name + * @param execution + * @throws Exception + */ + public void buildNetworkCollectionName(BuildingBlockExecution execution) throws Exception { + try{ + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + InstanceGroup instanceGroup = serviceInstance.getCollection().getInstanceGroup(); + if(instanceGroup.getModelInfoInstanceGroup() != null) { + //Build collection name assembling SI name and IG function + if(serviceInstance.getServiceInstanceName() != null + && instanceGroup.getModelInfoInstanceGroup().getFunction() != null) { + String networkCollectionName = serviceInstance.getServiceInstanceName().concat(UNDERSCORE).concat(instanceGroup.getModelInfoInstanceGroup().getFunction()); + //set networkCollectionName object on execution to be re-used within current BB + execution.setVariable(NETWORK_COLLECTION_NAME, networkCollectionName); + } else { + throw new IllegalArgumentException("Cannot generate collection name because either one or both fields are null: " + + " Service Instance Name: " + serviceInstance.getServiceInstanceName() + + ", Instance Group Function: " + instanceGroup.getModelInfoInstanceGroup().getFunction()); + } + } else { + throw new IllegalArgumentException("Instance group model info is null"); + } + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to connect Network Collection + * @param execution + * @throws Exception + */ + public void connectCollectionToInstanceGroup(BuildingBlockExecution execution) throws Exception { + execution.setVariable("connectCollectionToInstanceGroupRollback", false); + try{ + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + Collection networkCollection = serviceInstance.getCollection(); + aaiNetworkResources.connectNetworkCollectionInstanceGroupToNetworkCollection(networkCollection.getInstanceGroup(), networkCollection); + execution.setVariable("connectCollectionToInstanceGroupRollback", true); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to connect Network Collection + * @param execution + * @throws Exception + */ + public void connectCollectionToServiceInstance(BuildingBlockExecution execution) throws Exception { + execution.setVariable("connectCollectionToServiceInstanceRollback", false); + try{ + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + Collection networkCollection = serviceInstance.getCollection(); + aaiNetworkResources.connectNetworkCollectionToServiceInstance(networkCollection, serviceInstance); + execution.setVariable("connectCollectionToServiceInstanceRollback", true); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/NetworkBBUtils.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/NetworkBBUtils.java new file mode 100644 index 0000000000..7051da150f --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/NetworkBBUtils.java @@ -0,0 +1,77 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.flowspecific.tasks; + +import java.util.List; +import java.util.Optional; + +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock; +import org.onap.so.logger.MsoLogger; +import org.springframework.stereotype.Component; + +@Component +public class NetworkBBUtils { + + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, NetworkBBUtils.class); + + private static final String CLOUD_REGION_VER25 = "2.5"; + private static final String CLOUD_REGION_AAIAIC25 = "AAIAIC25"; + + /** + * BPMN access method to check if Relationship's Related-To value exists. + * + * @param l3Network - L3Network object + * @param relatedToValue - String, ex: 'vf-module' + * @return boolean + */ + public boolean isRelationshipRelatedToExists(Optional<org.onap.aai.domain.yang.L3Network> l3network, String relatedToValue) { + boolean isRelatedToExists = false; + if (l3network.isPresent()) { + List<org.onap.aai.domain.yang.Relationship> relationshipList = l3network.get().getRelationshipList().getRelationship(); + for (org.onap.aai.domain.yang.Relationship relationship : relationshipList) { + if (relationship.getRelatedTo().equals(relatedToValue)) { + isRelatedToExists = true; + break; + } + } + } + return isRelatedToExists; + } + + /** + * BPMN access method to extract Cloud Region data + * @param execution + * @param motsValue (ex: SourceSystem.SDNC or SourceSystem.PO) + */ + public String getCloudRegion(BuildingBlockExecution execution, SourceSystem sourceValue) { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + CloudRegion cloudRegion = gBBInput.getCloudRegion(); + String cloudRegionId = cloudRegion.getLcpCloudRegionId(); + if (sourceValue.equals(SourceSystem.SDNC) && CLOUD_REGION_VER25.equalsIgnoreCase(cloudRegion.getCloudRegionVersion())) { + cloudRegionId = CLOUD_REGION_AAIAIC25; + } + return cloudRegionId; + } + + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/SourceSystem.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/SourceSystem.java new file mode 100644 index 0000000000..596b280916 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/SourceSystem.java @@ -0,0 +1,26 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.flowspecific.tasks; + +public enum SourceSystem { + PO, + SDNC +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/UnassignNetworkBB.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/UnassignNetworkBB.java new file mode 100644 index 0000000000..f94b967643 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/UnassignNetworkBB.java @@ -0,0 +1,104 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.flowspecific.tasks; + +import java.util.Optional; + +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.client.aai.entities.AAIResultWrapper; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class UnassignNetworkBB { + + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, UnassignNetworkBB.class); + + private static String MESSAGE_CANNOT_PERFORM_UNASSIGN = "Cannot perform Unassign Network. Network is still related to "; + private static String MESSAGE_ERROR_ROLLBACK = " Rollback is not possible. Please restore data manually."; + + @Autowired + private ExceptionBuilder exceptionUtil; + + @Autowired + private NetworkBBUtils networkBBUtils; + + /** + * BPMN access method to prepare overall error messages. + * + * @param execution - BuildingBlockExecution + * @param relatedToValue - String, ex: vf-module + * @return void - nothing + * @throws Exception + */ + + public void checkRelationshipRelatedTo(BuildingBlockExecution execution, String relatedToValue) throws Exception { + try { + AAIResultWrapper aaiResultWrapper = execution.getVariable("l3NetworkAAIResultWrapper"); + Optional<org.onap.aai.domain.yang.L3Network> l3network = aaiResultWrapper.asBean(org.onap.aai.domain.yang.L3Network.class); + if (networkBBUtils.isRelationshipRelatedToExists(l3network, relatedToValue)) { + String msg = MESSAGE_CANNOT_PERFORM_UNASSIGN + relatedToValue; + execution.setVariable("ErrorUnassignNetworkBB", msg); + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg); + } + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to getCloudRegionId + * + * @param execution - BuildingBlockExecution + * @return void - nothing + * @throws Exception + */ + + public void getCloudSdncRegion(BuildingBlockExecution execution) throws Exception { + try { + String cloudRegionSdnc = networkBBUtils.getCloudRegion(execution, SourceSystem.SDNC); + execution.setVariable("cloudRegionSdnc", cloudRegionSdnc); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to prepare overall error messages. + * + * @param execution - BuildingBlockExecution + * @return void - nothing + */ + public void errorEncountered(BuildingBlockExecution execution) { + String msg; + boolean isRollbackNeeded = execution.getVariable("isRollbackNeeded") != null ? execution.getVariable("isRollbackNeeded") : false; + if (isRollbackNeeded == true) { + msg = execution.getVariable("ErrorUnassignNetworkBB") + MESSAGE_ERROR_ROLLBACK; + } else { + msg = execution.getVariable("ErrorUnassignNetworkBB"); + } + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg); + } + + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/UnassignVnf.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/UnassignVnf.java new file mode 100644 index 0000000000..b9360b3d81 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/UnassignVnf.java @@ -0,0 +1,63 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.flowspecific.tasks; + +import java.util.List; + +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.infrastructure.common.name.generation.AAIObjectInstanceNameGenerator; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.InstanceGroup; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoInstanceGroup; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.client.orchestration.AAIInstanceGroupResources; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component() +public class UnassignVnf { + @Autowired + private ExceptionBuilder exceptionUtil; + @Autowired + private ExtractPojosForBB extractPojosForBB; + @Autowired + private AAIInstanceGroupResources aaiInstanceGroupResources; + @Autowired + private AAIObjectInstanceNameGenerator aaiObjectInstanceNameGenerator; + + public void deleteInstanceGroups(BuildingBlockExecution execution) { + try { + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + List<InstanceGroup> instanceGroups = vnf.getInstanceGroups(); + for(InstanceGroup instanceGroup : instanceGroups) { + if(ModelInfoInstanceGroup.TYPE_VNFC.equalsIgnoreCase(instanceGroup.getModelInfoInstanceGroup().getType())) { + aaiInstanceGroupResources.deleteInstanceGroup(instanceGroup); + } + } + } + catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCActivateTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCActivateTasks.java new file mode 100644 index 0000000000..e587e80251 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCActivateTasks.java @@ -0,0 +1,121 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.sdnc.tasks; + +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule; +import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.BBObjectNotFoundException; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.client.orchestration.SDNCNetworkResources; +import org.onap.so.client.orchestration.SDNCVfModuleResources; +import org.onap.so.client.orchestration.SDNCVnfResources; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class SDNCActivateTasks { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, SDNCActivateTasks.class); + @Autowired + private SDNCVnfResources sdncVnfResources; + @Autowired + private ExceptionBuilder exceptionUtil; + @Autowired + private ExtractPojosForBB extractPojosForBB; + @Autowired + private SDNCNetworkResources sdncNetworkResources; + @Autowired + private SDNCVfModuleResources sdncVfModuleResources; + + + public void activateVnf(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + RequestContext requestContext = gBBInput.getRequestContext(); + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + CloudRegion cloudRegion = gBBInput.getCloudRegion(); + Customer customer = gBBInput.getCustomer(); + String response = sdncVnfResources.activateVnf(vnf, serviceInstance, customer, cloudRegion, requestContext); + execution.setVariable("SDNCResponse", response); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to perform Assign action on SDNC for L3Network + * @param execution + * @throws BBObjectNotFoundException + */ + public void activateNetwork(BuildingBlockExecution execution) throws BBObjectNotFoundException { + execution.setVariable("sdncNetworkActivateRollback", false); + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + + L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + + Customer customer = gBBInput.getCustomer(); + RequestContext requestContext = gBBInput.getRequestContext(); + CloudRegion cloudRegion = gBBInput.getCloudRegion(); + try { + sdncNetworkResources.activateNetwork(l3network, serviceInstance, customer, requestContext, cloudRegion); + execution.setVariable("sdncNetworkActivateRollback", true); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void activateVfModule(BuildingBlockExecution execution) { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + RequestContext requestContext = gBBInput.getRequestContext(); + ServiceInstance serviceInstance = null; + GenericVnf vnf = null; + VfModule vfModule = null; + try { + serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, + execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, + execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, + execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + Customer customer = gBBInput.getCustomer(); + CloudRegion cloudRegion = gBBInput.getCloudRegion(); + execution.setVariable("sdncActivateVfModuleRollback", false); + + String response = sdncVfModuleResources.activateVfModule(vfModule, vnf, serviceInstance, customer, + cloudRegion, requestContext); + execution.setVariable("SDNCActivateVfModuleResponse", response); + execution.setVariable("sdncActivateVfModuleRollback", true); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCAssignTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCAssignTasks.java new file mode 100644 index 0000000000..95d52d6f2a --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCAssignTasks.java @@ -0,0 +1,133 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.sdnc.tasks; + +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup; +import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.BBObjectNotFoundException; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.client.orchestration.SDNCNetworkResources; +import org.onap.so.client.orchestration.SDNCServiceInstanceResources; +import org.onap.so.client.orchestration.SDNCVfModuleResources; +import org.onap.so.client.orchestration.SDNCVnfResources; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class SDNCAssignTasks { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, SDNCAssignTasks.class); + @Autowired + private SDNCServiceInstanceResources sdncSIResources; + @Autowired + private SDNCVnfResources sdncVnfResources; + @Autowired + private SDNCVfModuleResources sdncVfModuleResources; + @Autowired + private ExceptionBuilder exceptionUtil; + @Autowired + private ExtractPojosForBB extractPojosForBB; + @Autowired + private SDNCNetworkResources sdncNetworkResources; + + public void assignServiceInstance(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + RequestContext requestContext = gBBInput.getRequestContext(); + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + Customer customer = gBBInput.getCustomer(); + String response = sdncSIResources.assignServiceInstance(serviceInstance, customer, requestContext); + execution.setVariable("SDNCResponse", response); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void assignVnf(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + RequestContext requestContext = gBBInput.getRequestContext(); + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + Customer customer = gBBInput.getCustomer(); + CloudRegion cloudRegion = gBBInput.getCloudRegion(); + String response = sdncVnfResources.assignVnf(vnf, serviceInstance, customer, cloudRegion, requestContext, vnf.isCallHoming()); + execution.setVariable("SDNCResponse", response); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void assignVfModule(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + RequestContext requestContext = gBBInput.getRequestContext(); + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + VolumeGroup volumeGroup = null; + try{ + volumeGroup = extractPojosForBB.extractByKey(execution, ResourceKey.VOLUME_GROUP_ID, execution.getLookupMap().get(ResourceKey.VOLUME_GROUP_ID)); + } catch (BBObjectNotFoundException e){ + msoLogger.info("No volume group was found."); + } + Customer customer = gBBInput.getCustomer(); + CloudRegion cloudRegion = gBBInput.getCloudRegion(); + + String response = sdncVfModuleResources.assignVfModule(vfModule, volumeGroup, vnf, serviceInstance, customer, cloudRegion, requestContext); + execution.setVariable("SDNCAssignResponse_"+ vfModule.getVfModuleId(), response); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to perform Assign action on SDNC for L3Network + * @param execution + * @throws Exception + */ + public void assignNetwork(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + + L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + + Customer customer = gBBInput.getCustomer(); + RequestContext requestContext = gBBInput.getRequestContext(); + CloudRegion cloudRegion = gBBInput.getCloudRegion(); + + sdncNetworkResources.assignNetwork(l3network, serviceInstance, customer, requestContext, cloudRegion); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCChangeAssignTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCChangeAssignTasks.java new file mode 100644 index 0000000000..cae4dc26de --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCChangeAssignTasks.java @@ -0,0 +1,110 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.sdnc.tasks; + +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule; +import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.client.orchestration.SDNCNetworkResources; +import org.onap.so.client.orchestration.SDNCServiceInstanceResources; +import org.onap.so.client.orchestration.SDNCVfModuleResources; +import org.onap.so.client.orchestration.SDNCVnfResources; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class SDNCChangeAssignTasks { + @Autowired + private SDNCNetworkResources sdncNetworkResources; + @Autowired + private SDNCServiceInstanceResources sdncServiceInstanceResources; + @Autowired + private SDNCVnfResources sdncVnfResources; + @Autowired + private ExtractPojosForBB extractPojosForBB; + @Autowired + private ExceptionBuilder exceptionUtil; + @Autowired + private SDNCVfModuleResources sdncVfModuleResources; + + public void changeModelServiceInstance(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + + String response = sdncServiceInstanceResources.changeModelServiceInstance(serviceInstance, gBBInput.getCustomer(), gBBInput.getRequestContext()); + execution.setVariable("SDNCChangeAssignTasks.changeModelServiceInstance.response", response); + } catch(Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void changeModelVnf(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + GenericVnf genericVnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + + String response = sdncVnfResources.changeModelVnf(genericVnf, serviceInstance, gBBInput.getCustomer(), gBBInput.getCloudRegion(), gBBInput.getRequestContext()); + execution.setVariable("SDNCChangeModelVnfResponse", response); + } catch(Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void changeAssignNetwork(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + L3Network network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + + String sdncResponse = sdncNetworkResources.changeAssignNetwork(network, serviceInstance, gBBInput.getCustomer(), gBBInput.getRequestContext(), gBBInput.getCloudRegion()); + execution.setVariable("SDNCChangeAssignNetworkResponse", sdncResponse); + } catch(Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void changeAssignModelVfModule(BuildingBlockExecution execution) throws Exception { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + RequestContext requestContext = gBBInput.getRequestContext(); + CloudRegion cloudRegion = gBBInput.getCloudRegion(); + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + Customer customer = gBBInput.getCustomer(); + String response = sdncVfModuleResources.changeAssignVfModule(vfModule, vnf, serviceInstance, customer, cloudRegion, requestContext); + execution.setVariable("SDNCChangeAssignVfModuleResponse", response); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCDeactivateTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCDeactivateTasks.java new file mode 100644 index 0000000000..1f6ec72f34 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCDeactivateTasks.java @@ -0,0 +1,154 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.sdnc.tasks; + +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule; +import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.client.orchestration.SDNCNetworkResources; +import org.onap.so.client.orchestration.SDNCServiceInstanceResources; +import org.onap.so.client.orchestration.SDNCVfModuleResources; +import org.onap.so.client.orchestration.SDNCVnfResources; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class SDNCDeactivateTasks { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, + SDNCDeactivateTasks.class); + @Autowired + private SDNCNetworkResources sdncNetworkResources; + @Autowired + private SDNCVfModuleResources sdncVfModuleResources; + @Autowired + private SDNCServiceInstanceResources sdncSIResources; + @Autowired + private SDNCVnfResources sdncVnfResources; + @Autowired + private ExceptionBuilder exceptionUtil; + @Autowired + private ExtractPojosForBB extractPojosForBB; + + public void deactivateVfModule(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + RequestContext requestContext = gBBInput.getRequestContext(); + + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, + execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, + execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, + execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + + Customer customer = gBBInput.getCustomer(); + CloudRegion cloudRegion = gBBInput.getCloudRegion(); + execution.setVariable("sdncDeactivateVfModuleRollback", false); + + String response = sdncVfModuleResources.deactivateVfModule(vfModule, vnf, serviceInstance, customer, + cloudRegion, requestContext); + execution.setVariable("SDNCDeactivateVfModuleResponse", response); + execution.setVariable("sdncDeactivateVfModuleRollback", true); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to perform Service Topology Deactivate action on SDNC for Vnf + * @param execution + * @throws Exception + */ + public void deactivateVnf(BuildingBlockExecution execution) throws Exception { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + RequestContext requestContext = gBBInput.getRequestContext(); + ServiceInstance serviceInstance = null; + GenericVnf vnf = null; + + serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, + execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, + execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + CloudRegion cloudRegion = gBBInput.getCloudRegion(); + Customer customer = gBBInput.getCustomer(); + String response = sdncVnfResources.deactivateVnf(vnf, serviceInstance, customer, cloudRegion, requestContext); + execution.setVariable("SDNCDeactivateVnfResponse", response); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /* + * BPMN access method to perform Service Topology Deactivate action on SDNC for Service Instance + * @param execution + * @throws Exception + */ + public void deactivateServiceInstance(BuildingBlockExecution execution) throws Exception { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + RequestContext requestContext = gBBInput.getRequestContext(); + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, + execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + Customer customer = gBBInput.getCustomer(); + execution.setVariable("sdncServiceInstanceRollback", false); + String response = sdncSIResources.deactivateServiceInstance(serviceInstance, customer, requestContext); + execution.setVariable("deactivateServiceInstanceSDNCResponse", response); + execution.setVariable("sdncServiceInstanceRollback", true); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + /** + * BPMN access method to invoke deactivate on a L3Network object + * + * @param execution + */ + public void deactivateNetwork(BuildingBlockExecution execution) { + execution.setVariable("SDNCDeactivateTasks.deactivateNetwork.rollback", false); + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + L3Network l3Network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + Customer customer = gBBInput.getCustomer(); + RequestContext requestContext = gBBInput.getRequestContext(); + CloudRegion cloudRegion = gBBInput.getCloudRegion(); + + String response = sdncNetworkResources.deactivateNetwork(l3Network, serviceInstance, customer, + requestContext, cloudRegion); + execution.setVariable("SDNCDeactivateTasks.deactivateNetwork.response", response); + execution.setVariable("SDNCDeactivateTasks.deactivateNetwork.rollback", true); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCDeleteTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCDeleteTasks.java new file mode 100644 index 0000000000..6d81cba41d --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCDeleteTasks.java @@ -0,0 +1,28 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.sdnc.tasks; + +import org.springframework.stereotype.Component; + +@Component +public class SDNCDeleteTasks { + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCQueryTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCQueryTasks.java new file mode 100644 index 0000000000..1fe3143c4a --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCQueryTasks.java @@ -0,0 +1,97 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.sdnc.tasks; + +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.BBObjectNotFoundException; +import org.onap.so.client.exception.BadResponseException; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.client.orchestration.SDNCVnfResources; +import org.onap.so.client.orchestration.SDNCVfModuleResources; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class SDNCQueryTasks { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, SDNCQueryTasks.class); + @Autowired + private SDNCVnfResources sdncVnfResources; + @Autowired + private SDNCVfModuleResources sdncVfModuleResources; + @Autowired + private ExceptionBuilder exceptionUtil; + @Autowired + private ExtractPojosForBB extractPojosForBB; + + public void queryVnf(BuildingBlockExecution execution) throws Exception { + GenericVnf genericVnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + + try { + String response = sdncVnfResources.queryVnf(genericVnf); + execution.setVariable("SDNCQueryResponse_" + genericVnf.getVnfId(), response); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + + public void queryVfModule(BuildingBlockExecution execution) throws Exception { + VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + + try { + if(vfModule.getSelflink() != null && !vfModule.getSelflink().isEmpty()) { + String response = sdncVfModuleResources.queryVfModule(vfModule); + execution.setVariable("SDNCQueryResponse_" + vfModule.getVfModuleId(), response); + } + else { + throw new Exception("Vf Module " + vfModule.getVfModuleId() + " exists in gBuildingBlock but does not have a selflink value"); + } + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void queryVfModuleForVolumeGroup(BuildingBlockExecution execution) { + try { + VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + if(vfModule.getSelflink() != null && !vfModule.getSelflink().isEmpty()) { + String response = sdncVfModuleResources.queryVfModule(vfModule); + execution.setVariable("SDNCQueryResponse_" + vfModule.getVfModuleId(), response); + } + else { + throw new Exception("Vf Module " + vfModule.getVfModuleId() + " exists in gBuildingBlock but does not have a selflink value"); + } + } catch(BBObjectNotFoundException bbException) { + // If there is not a vf module in the general building block, we will not call SDNC and proceed as normal without throwing an error + // If we see a bb object not found exception for something that is not a vf module id, then we should throw the error as normal + if(!ResourceKey.VF_MODULE_ID.equals(bbException.getResourceKey())) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, bbException); + } + } catch(Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCUnassignTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCUnassignTasks.java new file mode 100644 index 0000000000..13639daa44 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCUnassignTasks.java @@ -0,0 +1,143 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.sdnc.tasks; + +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule; +import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.client.orchestration.SDNCServiceInstanceResources; +import org.onap.so.client.orchestration.SDNCVfModuleResources; +import org.onap.so.client.orchestration.SDNCVnfResources; +import org.onap.so.db.catalog.beans.OrchestrationStatus; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network; +import org.onap.so.client.orchestration.SDNCNetworkResources; + +@Component +public class SDNCUnassignTasks { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, SDNCUnassignTasks.class); + @Autowired + private SDNCServiceInstanceResources sdncSIResources; + @Autowired + private SDNCVfModuleResources sdncVfModuleResources; + @Autowired + private SDNCVnfResources sdncVnfResources; + @Autowired + private ExceptionBuilder exceptionUtil; + @Autowired + private ExtractPojosForBB extractPojosForBB; + @Autowired + private SDNCNetworkResources sdncNetworkResources; + + public void unassignServiceInstance(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + + if (serviceInstance.getOrchestrationStatus() == OrchestrationStatus.INVENTORIED) { + return; // If INVENTORIED then SDNC unassign is not necessary + } + + RequestContext requestContext = gBBInput.getRequestContext(); + Customer customer = gBBInput.getCustomer(); + String sdncUnassignResponse = sdncSIResources.unassignServiceInstance(serviceInstance, customer, requestContext); + execution.setVariable("sdncUnassignResponse", sdncUnassignResponse); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void unassignVfModule(BuildingBlockExecution execution) { + try { + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + + if (OrchestrationStatus.INVENTORIED == vfModule.getOrchestrationStatus() || OrchestrationStatus.PENDING_CREATE == vfModule.getOrchestrationStatus()) { + return; // If INVENTORIED or PENDING_CREATE then SDNC unassign is not necessary + } + + execution.setVariable("sdncVfModuleRollback", false); + + String response = sdncVfModuleResources.unassignVfModule(vfModule, vnf, serviceInstance); + execution.setVariable("SDNCResponse", response); + execution.setVariable("sdncVfModuleRollback", true); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void unassignVnf(BuildingBlockExecution execution) { + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + + if (OrchestrationStatus.INVENTORIED == vnf.getOrchestrationStatus() || OrchestrationStatus.CREATED == vnf.getOrchestrationStatus()) { + return; // If INVENTORIED or CREATED then SDNC unassign is not necessary + } + + RequestContext requestContext = gBBInput.getRequestContext(); + Customer customer = gBBInput.getCustomer(); + CloudRegion cloudRegion = gBBInput.getCloudRegion(); + execution.setVariable("sdncVnfRollback", false); + String response = sdncVnfResources.unassignVnf(vnf, serviceInstance, customer, cloudRegion, requestContext); + execution.setVariable("sdncUnassignVnfResponse", response); + execution.setVariable("sdncVnfRollback", true); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } + + public void unassignNetwork(BuildingBlockExecution execution) throws Exception { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + L3Network network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + + if (OrchestrationStatus.INVENTORIED == network.getOrchestrationStatus()) { + return; // If INVENTORIED then SDNC unassign is not necessary + } + + ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + Customer customer = gBBInput.getCustomer(); + RequestContext requestContext = gBBInput.getRequestContext(); + CloudRegion cloudRegion = gBBInput.getCloudRegion(); + String cloudRegionSdnc = execution.getVariable("cloudRegionSdnc"); + cloudRegion.setLcpCloudRegionId(cloudRegionSdnc); + try { + String response = sdncNetworkResources.unassignNetwork(network, serviceInstance, customer, requestContext, cloudRegion); + execution.setVariable("SDNCUnAssignNetworkResponse", response); + execution.setVariable("isRollbackNeeded", true); + } catch (Exception ex) { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex); + } + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/OrchestrationStatusValidator.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/OrchestrationStatusValidator.java new file mode 100644 index 0000000000..55ebad68aa --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/OrchestrationStatusValidator.java @@ -0,0 +1,117 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.workflow.tasks; + +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.client.exception.OrchestrationStatusValidationException; +import org.onap.so.db.catalog.beans.BuildingBlockDetail; +import org.onap.so.db.catalog.beans.OrchestrationStatus; +import org.onap.so.db.catalog.beans.OrchestrationStatusStateTransitionDirective; +import org.onap.so.db.catalog.beans.OrchestrationStatusValidationDirective; +import org.onap.so.db.catalog.client.CatalogDbClient; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class OrchestrationStatusValidator { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, OrchestrationStatusValidator.class); + + private static final String BUILDING_BLOCK_DETAIL_NOT_FOUND = "Building Block (%s) not set up in Orchestration_Status_Validation table in CatalogDB."; + private static final String UNKNOWN_RESOURCE_TYPE = "Building Block (%s) not set up correctly in Orchestration_Status_Validation table in CatalogDB. ResourceType=(%s), TargetAction=(%s)"; + private static final String ORCHESTRATION_VALIDATION_FAIL = "Orchestration Status Validation failed. ResourceType=(%s), TargetAction=(%s), OrchestrationStatus=(%s)"; + private static final String ORCHESTRATION_STATUS_VALIDATION_RESULT = "orchestrationStatusValidationResult"; + + + @Autowired + private ExtractPojosForBB extractPojosForBB; + @Autowired + private ExceptionBuilder exceptionBuilder; + @Autowired + private CatalogDbClient catalogDbClient; + + public void validateOrchestrationStatus(BuildingBlockExecution execution) { + try { + execution.setVariable(ORCHESTRATION_STATUS_VALIDATION_RESULT, null); + + String buildingBlockFlowName = (String) execution.getVariable("flowToBeCalled"); + + BuildingBlockDetail buildingBlockDetail = catalogDbClient.getBuildingBlockDetail(buildingBlockFlowName); + + if (buildingBlockDetail == null) { + throw new OrchestrationStatusValidationException(String.format(BUILDING_BLOCK_DETAIL_NOT_FOUND, buildingBlockFlowName)); + } + + OrchestrationStatus orchestrationStatus = null; + + switch(buildingBlockDetail.getResourceType()) { + case SERVICE: + org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + orchestrationStatus = serviceInstance.getOrchestrationStatus(); + break; + case VNF: + org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf genericVnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID, execution.getLookupMap().get(ResourceKey.GENERIC_VNF_ID)); + orchestrationStatus = genericVnf.getOrchestrationStatus(); + break; + case VF_MODULE: + org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID, execution.getLookupMap().get(ResourceKey.VF_MODULE_ID)); + orchestrationStatus = vfModule.getOrchestrationStatus(); + break; + case VOLUME_GROUP: + org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup volumeGroup = extractPojosForBB.extractByKey(execution, ResourceKey.VOLUME_GROUP_ID, execution.getLookupMap().get(ResourceKey.VOLUME_GROUP_ID)); + orchestrationStatus = volumeGroup.getOrchestrationStatus(); + break; + case NETWORK: + org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID, execution.getLookupMap().get(ResourceKey.NETWORK_ID)); + orchestrationStatus = network.getOrchestrationStatus(); + break; + case NETWORK_COLLECTION: + org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance serviceInst = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID, execution.getLookupMap().get(ResourceKey.SERVICE_INSTANCE_ID)); + org.onap.so.bpmn.servicedecomposition.bbobjects.Collection networkCollection = serviceInst.getCollection(); + orchestrationStatus = networkCollection.getOrchestrationStatus(); + break; + case CONFIGURATION: + org.onap.so.bpmn.servicedecomposition.bbobjects.Configuration configuration = extractPojosForBB.extractByKey(execution, ResourceKey.CONFIGURATION_ID, execution.getLookupMap().get(ResourceKey.CONFIGURATION_ID)); + orchestrationStatus = configuration.getOrchestrationStatus(); + break; + default: + // can't currently get here, so not tested. Added in case enum is expanded without a change to this code + throw new OrchestrationStatusValidationException(String.format(UNKNOWN_RESOURCE_TYPE, buildingBlockFlowName, buildingBlockDetail.getResourceType(), buildingBlockDetail.getTargetAction())); + } + + if(orchestrationStatus==null){ + throw new OrchestrationStatusValidationException("The resource's orchstration status is null. Cannot perform task on a null orchestration status"); + } + OrchestrationStatusStateTransitionDirective orchestrationStatusStateTransitionDirective = catalogDbClient.getOrchestrationStatusStateTransitionDirective(buildingBlockDetail.getResourceType(), orchestrationStatus, buildingBlockDetail.getTargetAction()); + + if (orchestrationStatusStateTransitionDirective.getFlowDirective() == OrchestrationStatusValidationDirective.FAIL) { + throw new OrchestrationStatusValidationException(String.format(ORCHESTRATION_VALIDATION_FAIL, buildingBlockDetail.getResourceType(), buildingBlockDetail.getTargetAction(), orchestrationStatus)); + } + + execution.setVariable(ORCHESTRATION_STATUS_VALIDATION_RESULT, orchestrationStatusStateTransitionDirective.getFlowDirective()); + } catch (Exception e) { + exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, e); + } + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/Resource.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/Resource.java new file mode 100644 index 0000000000..fd5f00ed6f --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/Resource.java @@ -0,0 +1,60 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.workflow.tasks; + +public class Resource { + + private String resourceId; + private WorkflowType resourceType; + private boolean generated; + private boolean baseVfModule; + + public Resource(WorkflowType resourceType, String resourceId, boolean generated){ + this.resourceId = resourceId; + this.resourceType = resourceType; + this.generated = generated; + } + + public String getResourceId() { + return resourceId; + } + public void setResourceId(String resourceId) { + this.resourceId = resourceId; + } + public WorkflowType getResourceType() { + return resourceType; + } + public void setResourceType(WorkflowType resourceType) { + this.resourceType = resourceType; + } + public boolean isGenerated() { + return generated; + } + public void setGenerated(boolean generated) { + this.generated = generated; + } + public boolean isBaseVfModule() { + return baseVfModule; + } + public void setBaseVfModule(boolean baseVfModule) { + this.baseVfModule = baseVfModule; + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java new file mode 100644 index 0000000000..0f02928d16 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java @@ -0,0 +1,864 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.workflow.tasks; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.javatuples.Pair; +import org.onap.aai.domain.yang.GenericVnf; +import org.onap.aai.domain.yang.L3Network; +import org.onap.aai.domain.yang.ServiceInstance; +import org.onap.aai.domain.yang.VolumeGroup; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule; +import org.onap.so.bpmn.servicedecomposition.entities.BuildingBlock; +import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock; +import org.onap.so.bpmn.servicedecomposition.entities.WorkflowResourceIds; +import org.onap.so.bpmn.servicedecomposition.tasks.BBInputSetup; +import org.onap.so.bpmn.servicedecomposition.tasks.BBInputSetupUtils; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.db.catalog.beans.CollectionResourceCustomization; +import org.onap.so.db.catalog.beans.CollectionResourceInstanceGroupCustomization; +import org.onap.so.db.catalog.beans.InstanceGroup; +import org.onap.so.db.catalog.beans.NetworkCollectionResourceCustomization; +import org.onap.so.db.catalog.beans.VfModuleCustomization; +import org.onap.so.db.catalog.beans.macro.NorthBoundRequest; +import org.onap.so.db.catalog.beans.macro.OrchestrationFlow; +import org.onap.so.db.catalog.client.CatalogDbClient; +import org.onap.so.logger.MessageEnum; +import org.onap.so.logger.MsoLogger; +import org.onap.so.serviceinstancebeans.ModelInfo; +import org.onap.so.serviceinstancebeans.ModelType; +import org.onap.so.serviceinstancebeans.Networks; +import org.onap.so.serviceinstancebeans.RequestDetails; +import org.onap.so.serviceinstancebeans.Service; +import org.onap.so.serviceinstancebeans.ServiceInstancesRequest; +import org.onap.so.serviceinstancebeans.VfModules; +import org.onap.so.serviceinstancebeans.Vnfs; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.fasterxml.jackson.databind.ObjectMapper; + +@Component +public class WorkflowAction { + + private static final String G_ORCHESTRATION_FLOW = "gOrchestrationFlow"; + private static final String G_ACTION = "requestAction"; + private static final String G_CURRENT_SEQUENCE = "gCurrentSequence"; + private static final String G_REQUEST_ID = "mso-request-id"; + private static final String G_BPMN_REQUEST = "bpmnRequest"; + private static final String G_ALACARTE = "aLaCarte"; + private static final String G_APIVERSION = "apiVersion"; + private static final String G_URI = "requestUri"; + private static final String G_ISTOPLEVELFLOW = "isTopLevelFlow"; + private static final String VNF_TYPE = "vnfType"; + private static final String SERVICE = "Service"; + private static final String VNF = "Vnf"; + private static final String VFMODULE = "VfModule"; + private static final String VOLUMEGROUP = "VolumeGroup"; + private static final String NETWORK = "Network"; + private static final String NETWORKCOLLECTION = "NetworkCollection"; + private static final String ASSIGNINSTANCE = "assignInstance"; + private static final String CREATEINSTANCE = "createInstance"; + private static final String USERPARAMSERVICE = "service"; + private static final String supportedTypes = "vnfs|vfModules|networks|networkCollections|volumeGroups|serviceInstances"; + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, WorkflowAction.class); + + @Autowired + protected BBInputSetup bbInputSetup; + @Autowired + protected BBInputSetupUtils bbInputSetupUtils; + @Autowired + private ExceptionBuilder exceptionBuilder; + @Autowired + private CatalogDbClient catalogDbClient; + + public void setBbInputSetupUtils(BBInputSetupUtils bbInputSetupUtils) { + this.bbInputSetupUtils = bbInputSetupUtils; + } + + public void setBbInputSetup(BBInputSetup bbInputSetup) { + this.bbInputSetup = bbInputSetup; + } + + public void selectExecutionList(DelegateExecution execution) throws Exception { + final String requestAction = (String) execution.getVariable(G_ACTION); + final String requestId = (String) execution.getVariable(G_REQUEST_ID); + final String bpmnRequest = (String) execution.getVariable(G_BPMN_REQUEST); + final boolean aLaCarte = (boolean) execution.getVariable(G_ALACARTE); + final String apiVersion = (String) execution.getVariable(G_APIVERSION); + final String uri = (String) execution.getVariable(G_URI); + final String vnfType = (String) execution.getVariable(VNF_TYPE); + List<OrchestrationFlow> orchFlows = (List<OrchestrationFlow>) execution.getVariable(G_ORCHESTRATION_FLOW); + List<ExecuteBuildingBlock> flowsToExecute = new ArrayList<>(); + WorkflowResourceIds workflowResourceIds = populateResourceIdsFromApiHandler(execution); + List<Pair<WorkflowType, String>> aaiResourceIds = new ArrayList<>(); + List<Resource> resourceCounter = new ArrayList<>(); + + execution.setVariable("sentSyncResponse", false); + execution.setVariable("homing", false); + execution.setVariable("calledHoming", false); + + try { + ObjectMapper mapper = new ObjectMapper(); + execution.setVariable(G_ISTOPLEVELFLOW, true); + ServiceInstancesRequest sIRequest = mapper.readValue(bpmnRequest, ServiceInstancesRequest.class); + RequestDetails requestDetails = sIRequest.getRequestDetails(); + Resource resource = extractResourceIdAndTypeFromUri(uri); + WorkflowType resourceType = resource.getResourceType(); + String resourceId = ""; + if (resource.isGenerated()) { + resourceId = validateResourceIdInAAI(resource.getResourceId(), resourceType, + sIRequest.getRequestDetails().getRequestInfo().getInstanceName(), sIRequest.getRequestDetails(), + workflowResourceIds); + } else { + resourceId = resource.getResourceId(); + } + execution.setVariable("resourceId", resourceId); + execution.setVariable("resourceType", resourceType); + + if (aLaCarte) { + if (orchFlows == null || orchFlows.isEmpty()) { + orchFlows = queryNorthBoundRequestCatalogDb(execution, requestAction, resourceType, aLaCarte); + } + String key = ""; + ModelInfo modelInfo = sIRequest.getRequestDetails().getModelInfo(); + if(modelInfo.getModelType().equals(ModelType.service)) { + key = modelInfo.getModelVersionId(); + } else { + key = modelInfo.getModelCustomizationId(); + } + for (OrchestrationFlow orchFlow : orchFlows) { + ExecuteBuildingBlock ebb = buildExecuteBuildingBlock(orchFlow, requestId, key, apiVersion, resourceId, + requestAction, aLaCarte, vnfType, workflowResourceIds, requestDetails, false); + flowsToExecute.add(ebb); + } + } else { + boolean foundRelated = false; + boolean containsService = false; + if (resourceType == WorkflowType.SERVICE && requestAction.equalsIgnoreCase(ASSIGNINSTANCE)) { + // SERVICE-MACRO-ASSIGN will always get user params with a + // service. + if (sIRequest.getRequestDetails().getRequestParameters().getUserParams() != null) { + List<Map<String, Object>> userParams = sIRequest.getRequestDetails().getRequestParameters() + .getUserParams(); + for (Map<String, Object> params : userParams) { + if (params.containsKey(USERPARAMSERVICE)) { + containsService = true; + } + } + if (containsService) { + traverseUserParamsService(execution, resourceCounter, sIRequest, requestAction); + } + } else { + buildAndThrowException(execution, + "Service-Macro-Assign request details must contain user params with a service"); + } + } else if (resourceType == WorkflowType.SERVICE + && requestAction.equalsIgnoreCase(CREATEINSTANCE)) { + // SERVICE-MACRO-CREATE will get user params with a service, + // a service with a network, a service with a + // networkcollection, OR an empty service. + // If user params is just a service or null and macro + // queries the SI and finds a VNF, macro fails. + + if (sIRequest.getRequestDetails().getRequestParameters().getUserParams() != null) { + List<Map<String, Object>> userParams = sIRequest.getRequestDetails().getRequestParameters() + .getUserParams(); + for (Map<String, Object> params : userParams) { + if (params.containsKey(USERPARAMSERVICE)) { + containsService = true; + } + } + } + if (containsService) { + foundRelated = traverseUserParamsService(execution, resourceCounter, sIRequest, requestAction); + } + if (!foundRelated) { + traverseCatalogDbService(execution, sIRequest, resourceCounter); + } + } else if (resourceType == WorkflowType.SERVICE + && (requestAction.equalsIgnoreCase("activateInstance") + || requestAction.equalsIgnoreCase("unassignInstance") + || requestAction.equalsIgnoreCase("deleteInstance"))) { + // SERVICE-MACRO-ACTIVATE, SERVICE-MACRO-UNASSIGN, and + // SERVICE-MACRO-DELETE + // Will never get user params with service, macro will have + // to query the SI in AAI to find related instances. + traverseAAIService(execution, resourceCounter, resourceId, aaiResourceIds); + } else if (resourceType == WorkflowType.SERVICE + && requestAction.equalsIgnoreCase("deactivateInstance")) { + resourceCounter.add(new Resource(WorkflowType.SERVICE,"",false)); + } else { + buildAndThrowException(execution, "Current Macro Request is not supported"); + } + + String foundObjects = ""; + for(WorkflowType type : WorkflowType.values()){ + foundObjects = foundObjects + type + " - " + resourceCounter.stream().filter(x -> type.equals(x.getResourceType())).collect(Collectors.toList()).size() + " "; + } + msoLogger.info("Found " + foundObjects); + + if (orchFlows == null || orchFlows.isEmpty()) { + orchFlows = queryNorthBoundRequestCatalogDb(execution, requestAction, resourceType, aLaCarte); + } + flowsToExecute = buildExecuteBuildingBlockList(orchFlows, resourceCounter, requestId, apiVersion, resourceId, + resourceType, requestAction, aLaCarte, vnfType, workflowResourceIds, requestDetails); + if (!resourceCounter.stream().filter(x -> WorkflowType.NETWORKCOLLECTION == x.getResourceType()).collect(Collectors.toList()).isEmpty()) { + msoLogger.info("Sorting for Vlan Tagging"); + flowsToExecute = sortExecutionPathByObjectForVlanTagging(flowsToExecute, requestAction); + } + if (resourceType == WorkflowType.SERVICE + && (requestAction.equals(CREATEINSTANCE) || requestAction.equals(ASSIGNINSTANCE)) + && !resourceCounter.stream().filter(x -> VNF.equals(x.getResourceType())).collect(Collectors.toList()).isEmpty()) { + execution.setVariable("homing", true); + execution.setVariable("calledHoming", false); + } + if (resourceType == WorkflowType.SERVICE && (requestAction.equalsIgnoreCase(ASSIGNINSTANCE) || requestAction.equalsIgnoreCase(CREATEINSTANCE))){ + generateResourceIds(flowsToExecute, resourceCounter); + }else{ + updateResourceIdsFromAAITraversal(flowsToExecute, resourceCounter, aaiResourceIds); + } + } + + if (flowsToExecute.isEmpty()) { + throw new IllegalStateException("Macro did not come up with a valid execution path."); + } + + msoLogger.info("List of BuildingBlocks to execute:"); + for (ExecuteBuildingBlock ebb : flowsToExecute) { + msoLogger.info(ebb.getBuildingBlock().getBpmnFlowName()); + } + + execution.setVariable(G_CURRENT_SEQUENCE, 0); + execution.setVariable("retryCount", 0); + execution.setVariable("flowsToExecute", flowsToExecute); + + } catch (Exception ex) { + buildAndThrowException(execution, "Exception in create execution list " + ex.getMessage(), ex); + } + } + + protected List<Resource> sortVfModulesByBaseFirst(List<Resource> vfModuleResources) { + int count = 0; + for(Resource resource : vfModuleResources){ + if(resource.isBaseVfModule()){ + Collections.swap(vfModuleResources, 0, count); + break; + } + count++; + } + return vfModuleResources; + } + + private void updateResourceIdsFromAAITraversal(List<ExecuteBuildingBlock> flowsToExecute, + List<Resource> resourceCounter, List<Pair<WorkflowType, String>> aaiResourceIds) { + for(Pair<WorkflowType,String> pair : aaiResourceIds){ + msoLogger.debug(pair.getValue0() + ", " + pair.getValue1()); + } + + Arrays.stream(WorkflowType.values()).filter(type -> !type.equals(WorkflowType.SERVICE)).forEach(type -> { + List<Resource> resources = resourceCounter.stream().filter(x -> type.equals(x.getResourceType())).collect(Collectors.toList()); + for(int i = 0; i < resources.size(); i++){ + updateWorkflowResourceIds(flowsToExecute, type, resources.get(i).getResourceId(), retrieveAAIResourceId(aaiResourceIds,type)); + } + }); + } + + private String retrieveAAIResourceId(List<Pair<WorkflowType, String>> aaiResourceIds, WorkflowType resource){ + String id = null; + for(int i = 0; i<aaiResourceIds.size();i++){ + if(aaiResourceIds.get(i).getValue0() == resource){ + id = aaiResourceIds.get(i).getValue1(); + aaiResourceIds.remove(i); + break; + } + } + return id; + } + private void generateResourceIds(List<ExecuteBuildingBlock> flowsToExecute, List<Resource> resourceCounter) { + Arrays.stream(WorkflowType.values()).filter(type -> !type.equals(WorkflowType.SERVICE)).forEach(type -> { + List<Resource> resources = resourceCounter.stream().filter(x -> type.equals(x.getResourceType())).collect(Collectors.toList()); + for(int i = 0; i < resources.size(); i++){ + updateWorkflowResourceIds(flowsToExecute, type, resourceCounter.stream().filter(x -> type.equals(x.getResourceType())) + .collect(Collectors.toList()).get(i).getResourceId(), null); } + }); + } + + protected void updateWorkflowResourceIds(List<ExecuteBuildingBlock> flowsToExecute, WorkflowType resource, String key, String id){ + String resourceId = id; + if(resourceId==null){ + resourceId = UUID.randomUUID().toString(); + } + for(ExecuteBuildingBlock ebb : flowsToExecute){ + if(key != null && key.equalsIgnoreCase(ebb.getBuildingBlock().getKey()) && ebb.getBuildingBlock().getBpmnFlowName().contains(resource.toString())){ + WorkflowResourceIds workflowResourceIds = new WorkflowResourceIds(); + if(resource == WorkflowType.VNF){ + workflowResourceIds.setVnfId(resourceId); + }else if(resource == WorkflowType.VFMODULE){ + workflowResourceIds.setVfModuleId(resourceId); + }else if(resource == WorkflowType.VOLUMEGROUP){ + workflowResourceIds.setVolumeGroupId(resourceId); + }else if(resource == WorkflowType.NETWORK){ + workflowResourceIds.setNetworkId(resourceId); + }else if(resource == WorkflowType.NETWORKCOLLECTION){ + workflowResourceIds.setNetworkCollectionId(resourceId); + } + ebb.setWorkflowResourceIds(workflowResourceIds); + } + } + } + + protected CollectionResourceCustomization findCatalogNetworkCollection(DelegateExecution execution, org.onap.so.db.catalog.beans.Service service) { + CollectionResourceCustomization networkCollection = null; + int count = 0; + for(CollectionResourceCustomization collectionCust : service.getCollectionResourceCustomizations()){ + if(catalogDbClient.getNetworkCollectionResourceCustomizationByID(collectionCust.getModelCustomizationUUID()) + instanceof NetworkCollectionResourceCustomization) { + networkCollection = collectionCust; + count++; + } + } + if(count == 0){ + return null; + }else if(count > 1) { + buildAndThrowException(execution, "Found multiple Network Collections in the Service model, only one per Service is supported."); + } + return networkCollection; + } + + protected void traverseCatalogDbService(DelegateExecution execution, ServiceInstancesRequest sIRequest, + List<Resource> resourceCounter) { + String modelUUID = sIRequest.getRequestDetails().getModelInfo().getModelVersionId(); + org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(modelUUID); + if (service == null) { + buildAndThrowException(execution, "Could not find the service model in catalog db."); + } else { + resourceCounter.add(new Resource(WorkflowType.SERVICE,service.getModelUUID(),false)); + if (service.getVnfCustomizations() == null || service.getVnfCustomizations().isEmpty()) { + List<CollectionResourceCustomization> customizations = service.getCollectionResourceCustomizations(); + if(customizations.isEmpty()) { + msoLogger.debug("No Collections found. CollectionResourceCustomization list is empty."); + }else{ + CollectionResourceCustomization collectionResourceCustomization = findCatalogNetworkCollection(execution, service); + if(collectionResourceCustomization!=null){ + resourceCounter.add(new Resource(WorkflowType.NETWORKCOLLECTION,collectionResourceCustomization.getModelCustomizationUUID(),false)); + msoLogger.debug("Found a network collection"); + if(collectionResourceCustomization.getCollectionResource()!=null){ + if(collectionResourceCustomization.getCollectionResource().getInstanceGroup() != null){ + String toscaNodeType = collectionResourceCustomization.getCollectionResource().getInstanceGroup().getToscaNodeType(); + if (toscaNodeType != null && toscaNodeType.contains("NetworkCollection")) { + int minNetworks = 0; + InstanceGroup instanceGroup = collectionResourceCustomization.getCollectionResource().getInstanceGroup(); + CollectionResourceInstanceGroupCustomization collectionInstCust = null; + if(!instanceGroup.getCollectionInstanceGroupCustomizations().isEmpty()) { + collectionInstCust = instanceGroup.getCollectionInstanceGroupCustomizations().get(0); + if(collectionInstCust.getSubInterfaceNetworkQuantity() != null) { + minNetworks = collectionInstCust.getSubInterfaceNetworkQuantity(); + } + } + msoLogger.debug("minNetworks: " + minNetworks); + for (int i = 0; i < minNetworks; i++) { + if(collectionInstCust != null) { + + resourceCounter.add( + new Resource(WorkflowType.VIRTUAL_LINK,instanceGroup.getCollectionNetworkResourceCustomizations() + .get(0).getModelCustomizationUUID(),false)); + } + } + } else { + msoLogger.debug("Instance Group tosca node type does not contain NetworkCollection: " + toscaNodeType); + } + }else{ + msoLogger.debug("No Instance Group found for network collection."); + } + }else{ + msoLogger.debug("No Network Collection found. collectionResource is null"); + } + } else { + msoLogger.debug("No Network Collection Customization found"); + } + } + if (resourceCounter.stream().filter(x -> WorkflowType.NETWORKCOLLECTION == x.getResourceType()).collect(Collectors.toList()).isEmpty()) { + if (service.getNetworkCustomizations() == null) { + msoLogger.debug("No networks were found on this service model"); + } else { + for (int i = 0; i < service.getNetworkCustomizations().size(); i++) { + resourceCounter.add(new Resource(WorkflowType.NETWORK,service.getNetworkCustomizations().get(i).getModelCustomizationUUID(),false)); + } + } + } + } else { + buildAndThrowException(execution, + "Cannot orchestrate Service-Macro-Create without user params with a vnf. Please update ASDC model for new macro orchestration support or add service_recipe records to route to old macro flows"); + } + } + } + + protected void traverseAAIService(DelegateExecution execution, List<Resource> resourceCounter, String resourceId, List<Pair<WorkflowType, String>> aaiResourceIds) { + try { + ServiceInstance serviceInstanceAAI = bbInputSetupUtils.getAAIServiceInstanceById(resourceId); + org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance serviceInstanceMSO = bbInputSetup + .getExistingServiceInstance(serviceInstanceAAI); + resourceCounter.add(new Resource(WorkflowType.SERVICE,serviceInstanceMSO.getServiceInstanceId(),false)); + if (serviceInstanceMSO.getVnfs() != null) { + for (org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf vnf : serviceInstanceMSO + .getVnfs()) { + aaiResourceIds.add(new Pair<WorkflowType, String>(WorkflowType.VNF, vnf.getVnfId())); + resourceCounter.add(new Resource(WorkflowType.VNF,vnf.getVnfId(),false)); + if (vnf.getVfModules() != null) { + for (VfModule vfModule : vnf.getVfModules()) { + aaiResourceIds.add(new Pair<WorkflowType, String>(WorkflowType.VFMODULE, vfModule.getVfModuleId())); + resourceCounter.add(new Resource(WorkflowType.VFMODULE,vfModule.getVfModuleId(),false)); + } + } + if (vnf.getVolumeGroups() != null) { + for (org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup volumeGroup : vnf + .getVolumeGroups()) { + aaiResourceIds.add(new Pair<WorkflowType, String>(WorkflowType.VOLUMEGROUP, volumeGroup.getVolumeGroupId())); + resourceCounter.add(new Resource(WorkflowType.VOLUMEGROUP,volumeGroup.getVolumeGroupId(),false)); + } + } + } + } + if (serviceInstanceMSO.getNetworks() != null) { + for (org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network network : serviceInstanceMSO + .getNetworks()) { + aaiResourceIds.add(new Pair<WorkflowType, String>(WorkflowType.NETWORK, network.getNetworkId())); + resourceCounter.add(new Resource(WorkflowType.NETWORK,network.getNetworkId(),false)); + } + } + if (serviceInstanceMSO.getCollection() != null) { + msoLogger.debug("found networkcollection"); + aaiResourceIds.add(new Pair<WorkflowType, String>(WorkflowType.NETWORKCOLLECTION, serviceInstanceMSO.getCollection().getId())); + resourceCounter.add(new Resource(WorkflowType.NETWORKCOLLECTION,serviceInstanceMSO.getCollection().getId(),false)); + } + } catch (Exception ex) { + buildAndThrowException(execution, + "Could not find existing Service Instance or related Instances to execute the request on."); + } + } + + protected boolean traverseUserParamsService(DelegateExecution execution, List<Resource> resourceCounter, + ServiceInstancesRequest sIRequest, String requestAction) + throws IOException { + boolean foundRelated = false; + boolean foundVfModuleOrVG = false; + if (sIRequest.getRequestDetails().getRequestParameters().getUserParams() != null) { + List<Map<String, Object>> userParams = sIRequest.getRequestDetails().getRequestParameters().getUserParams(); + for (Map<String, Object> params : userParams) { + if (params.containsKey(USERPARAMSERVICE)) { + ObjectMapper obj = new ObjectMapper(); + String input = obj.writeValueAsString(params.get(USERPARAMSERVICE)); + Service validate = obj.readValue(input, Service.class); + resourceCounter.add(new Resource(WorkflowType.SERVICE,validate.getModelInfo().getModelVersionId(),false)); + if (validate.getResources().getVnfs() != null) { + for (Vnfs vnf : validate.getResources().getVnfs()) { + resourceCounter.add(new Resource(WorkflowType.VNF,vnf.getModelInfo().getModelCustomizationId(),false)); + foundRelated = true; + if (vnf.getVfModules() != null) { + for (VfModules vfModule : vnf.getVfModules()) { + VfModuleCustomization vfModuleCustomization = catalogDbClient + .getVfModuleCustomizationByModelCuztomizationUUID( + vfModule.getModelInfo().getModelCustomizationUuid()); + if (vfModuleCustomization != null) { + if(vfModuleCustomization.getVfModule()!=null && vfModuleCustomization.getVfModule().getVolumeHeatTemplate()!=null &&vfModuleCustomization.getVolumeHeatEnv() != null) { + resourceCounter.add(new Resource(WorkflowType.VOLUMEGROUP,vfModuleCustomization.getModelCustomizationUUID(),false)); + foundRelated = true; + foundVfModuleOrVG = true; + } + if(vfModuleCustomization.getVfModule()!=null && vfModuleCustomization.getVfModule().getModuleHeatTemplate()!=null && vfModuleCustomization.getHeatEnvironment()!=null){ + foundRelated = true; + foundVfModuleOrVG = true; + Resource resource = new Resource(WorkflowType.VFMODULE,vfModuleCustomization.getModelCustomizationUUID(),false); + if(vfModuleCustomization.getVfModule().getIsBase()!=null && vfModuleCustomization.getVfModule().getIsBase()){ + resource.setBaseVfModule(true); + }else{ + resource.setBaseVfModule(false); + } + resourceCounter.add(resource); + } + if(!foundVfModuleOrVG){ + buildAndThrowException(execution, "Could not determine if vfModule was a vfModule or volume group. Heat template and Heat env are null"); + } + } + } + } + } + } + if (validate.getResources().getNetworks() != null) { + for (Networks network : validate.getResources().getNetworks()) { + resourceCounter.add(new Resource(WorkflowType.NETWORK,network.getModelInfo().getModelCustomizationId(),false)); + foundRelated = true; + } + if (requestAction.equals(CREATEINSTANCE)) { + String networkColCustId = queryCatalogDBforNetworkCollection(execution, sIRequest); + if (networkColCustId != null) { + resourceCounter.add(new Resource(WorkflowType.NETWORKCOLLECTION,networkColCustId,false)); + foundRelated = true; + } + } + } + break; + } + } + } + return foundRelated; + } + + protected String queryCatalogDBforNetworkCollection(DelegateExecution execution, ServiceInstancesRequest sIRequest) { + org.onap.so.db.catalog.beans.Service service = catalogDbClient + .getServiceByID(sIRequest.getRequestDetails().getModelInfo().getModelVersionId()); + if (service != null) { + CollectionResourceCustomization networkCollection = this.findCatalogNetworkCollection(execution, service); + if(networkCollection != null) { + return networkCollection.getModelCustomizationUUID(); + } + } + return null; + } + + protected WorkflowResourceIds populateResourceIdsFromApiHandler(DelegateExecution execution) { + WorkflowResourceIds workflowResourceIds = new WorkflowResourceIds(); + workflowResourceIds.setServiceInstanceId((String) execution.getVariable("serviceInstanceId")); + workflowResourceIds.setNetworkId((String) execution.getVariable("networkId")); + workflowResourceIds.setVfModuleId((String) execution.getVariable("vfModuleId")); + workflowResourceIds.setVnfId((String) execution.getVariable("vnfId")); + workflowResourceIds.setVolumeGroupId((String) execution.getVariable("volumeGroupId")); + return workflowResourceIds; + } + + protected Resource extractResourceIdAndTypeFromUri(String uri) { + Pattern patt = Pattern.compile( + "[vV]\\d+.*?(?:(?:/(?<type>" + supportedTypes + ")(?:/(?<id>[^/]+))?)(?:/(?<action>[^/]+))?)?$"); + Matcher m = patt.matcher(uri); + Boolean generated = false; + + if (m.find()) { + msoLogger.debug("found match on " + uri + ": " + m); + String type = m.group("type"); + String id = m.group("id"); + String action = m.group("action"); + if (type == null) { + throw new IllegalArgumentException("Uri could not be parsed. No type found. " + uri); + } + if (action == null) { + if (type.equals("serviceInstances") && (id == null || id.equals("assign"))) { + id = UUID.randomUUID().toString(); + generated = true; + } + } else { + if (action.matches(supportedTypes)) { + id = UUID.randomUUID().toString(); + generated = true; + type = action; + } + } + return new Resource(WorkflowType.fromString(convertTypeFromPlural(type)), id, generated); + } else { + throw new IllegalArgumentException("Uri could not be parsed: " + uri); + } + } + + protected String validateResourceIdInAAI(String generatedResourceId, WorkflowType type, String instanceName, + RequestDetails reqDetails, WorkflowResourceIds workflowResourceIds) throws Exception { + try { + if ("SERVICE".equalsIgnoreCase(type.toString())) { + String globalCustomerId = reqDetails.getSubscriberInfo().getGlobalSubscriberId(); + String serviceType = reqDetails.getRequestParameters().getSubscriptionServiceType(); + if (instanceName != null) { + Optional<ServiceInstance> serviceInstanceAAI = bbInputSetupUtils + .getAAIServiceInstanceByName(globalCustomerId, serviceType, instanceName); + if (serviceInstanceAAI.isPresent()) { + return serviceInstanceAAI.get().getServiceInstanceId(); + } + } + } else if ("NETWORK".equalsIgnoreCase(type.toString())) { + Optional<L3Network> network = bbInputSetupUtils.getRelatedNetworkByNameFromServiceInstance( + workflowResourceIds.getServiceInstanceId(), instanceName); + if (network.isPresent()) { + return network.get().getNetworkId(); + } + } else if ("VNF".equalsIgnoreCase(type.toString())) { + Optional<GenericVnf> vnf = bbInputSetupUtils.getRelatedVnfByNameFromServiceInstance( + workflowResourceIds.getServiceInstanceId(), instanceName); + if (vnf.isPresent()) { + return vnf.get().getVnfId(); + } + } else if ("VFMODULE".equalsIgnoreCase(type.toString())) { + GenericVnf vnf = bbInputSetupUtils.getAAIGenericVnf(workflowResourceIds.getVnfId()); + if (vnf != null && vnf.getVfModules() != null) { + for (org.onap.aai.domain.yang.VfModule vfModule : vnf.getVfModules().getVfModule()) { + if (vfModule.getVfModuleName().equalsIgnoreCase(instanceName)) { + return vfModule.getVfModuleId(); + } + } + } + } else if ("VOLUMEGROUP".equalsIgnoreCase(type.toString())) { + Optional<VolumeGroup> volumeGroup = bbInputSetupUtils + .getRelatedVolumeGroupByNameFromVnf(workflowResourceIds.getVnfId(), instanceName); + if (volumeGroup.isPresent()) { + return volumeGroup.get().getVolumeGroupId(); + } + GenericVnf vnf = bbInputSetupUtils.getAAIGenericVnf(workflowResourceIds.getVnfId()); + if (vnf != null && vnf.getVfModules() != null) { + for (org.onap.aai.domain.yang.VfModule vfModule : vnf.getVfModules().getVfModule()) { + Optional<VolumeGroup> volumeGroupFromVfModule = bbInputSetupUtils + .getRelatedVolumeGroupByNameFromVfModule(vfModule.getVfModuleId(), instanceName); + if (volumeGroupFromVfModule.isPresent()) { + return volumeGroupFromVfModule.get().getVolumeGroupId(); + } + } + } + } + return generatedResourceId; + } catch (Exception ex) { + throw new IllegalStateException( + "WorkflowAction was unable to verify if the instance name already exist in AAI."); + } + } + + protected String convertTypeFromPlural(String type) { + if (!type.matches(supportedTypes)) { + return type; + } else { + if (type.equals("serviceInstances")) { + return SERVICE; + } else { + return type.substring(0, 1).toUpperCase() + type.substring(1, type.length() - 1); + } + } + } + + protected List<ExecuteBuildingBlock> sortExecutionPathByObjectForVlanTagging(List<ExecuteBuildingBlock> orchFlows, + String requestAction) { + List<ExecuteBuildingBlock> sortedOrchFlows = new ArrayList<>(); + if (requestAction.equals(CREATEINSTANCE)) { + for (ExecuteBuildingBlock ebb : orchFlows) { + if (ebb.getBuildingBlock().getBpmnFlowName().equals("AssignNetworkBB")) { + String key = ebb.getBuildingBlock().getKey(); + sortedOrchFlows.add(ebb); + for (ExecuteBuildingBlock ebb2 : orchFlows) { + if (ebb2.getBuildingBlock().getBpmnFlowName().equals("CreateNetworkBB") + && ebb2.getBuildingBlock().getKey().equalsIgnoreCase(key)) { + sortedOrchFlows.add(ebb2); + break; + } + } + for (ExecuteBuildingBlock ebb2 : orchFlows) { + if (ebb2.getBuildingBlock().getBpmnFlowName().equals("ActivateNetworkBB") + && ebb2.getBuildingBlock().getKey().equalsIgnoreCase(key)) { + sortedOrchFlows.add(ebb2); + break; + } + } + } else if (ebb.getBuildingBlock().getBpmnFlowName().equals("CreateNetworkBB") + || ebb.getBuildingBlock().getBpmnFlowName().equals("ActivateNetworkBB")) { + continue; + } else if (!ebb.getBuildingBlock().getBpmnFlowName().equals("")) { + sortedOrchFlows.add(ebb); + } + } + } else if (requestAction.equals("deleteInstance")) { + for (ExecuteBuildingBlock ebb : orchFlows) { + if (ebb.getBuildingBlock().getBpmnFlowName().equals("DeactivateNetworkBB")) { + sortedOrchFlows.add(ebb); + String key = ebb.getBuildingBlock().getKey(); + for (ExecuteBuildingBlock ebb2 : orchFlows) { + if (ebb2.getBuildingBlock().getBpmnFlowName().equals("DeleteNetworkBB") + && ebb2.getBuildingBlock().getKey().equalsIgnoreCase(key)) { + sortedOrchFlows.add(ebb2); + break; + } + } + for (ExecuteBuildingBlock ebb2 : orchFlows) { + if (ebb2.getBuildingBlock().getBpmnFlowName().equals("UnassignNetworkBB") + && ebb2.getBuildingBlock().getKey().equalsIgnoreCase(key)) { + sortedOrchFlows.add(ebb2); + break; + } + } + } else if (ebb.getBuildingBlock().getBpmnFlowName().equals("DeleteNetworkBB") + || ebb.getBuildingBlock().getBpmnFlowName().equals("UnassignNetworkBB")) { + continue; + } else if (!ebb.getBuildingBlock().getBpmnFlowName().equals("")) { + sortedOrchFlows.add(ebb); + } + } + } + return sortedOrchFlows; + } + + protected List<ExecuteBuildingBlock> buildExecuteBuildingBlockList(List<OrchestrationFlow> orchFlows, + List<Resource> resourceCounter, String requestId, String apiVersion, String resourceId, WorkflowType resourceType, + String requestAction, boolean aLaCarte, String vnfType, + WorkflowResourceIds workflowResourceIds, RequestDetails requestDetails) { + List<ExecuteBuildingBlock> flowsToExecute = new ArrayList<>(); + for (OrchestrationFlow orchFlow : orchFlows) { + if (orchFlow.getFlowName().contains(SERVICE)) { + for (int i = 0; i < resourceCounter.stream().filter(x -> WorkflowType.SERVICE == x.getResourceType()).collect(Collectors.toList()).size(); i++) { + workflowResourceIds.setServiceInstanceId(resourceId); + flowsToExecute.add(buildExecuteBuildingBlock(orchFlow, requestId, resourceCounter.stream().filter(x -> WorkflowType.SERVICE == x.getResourceType()) + .collect(Collectors.toList()).get(i).getResourceId(), apiVersion, resourceId, + requestAction, aLaCarte, vnfType, workflowResourceIds, requestDetails, false)); + } + } else if (orchFlow.getFlowName().contains(VNF)) { + for (int i = 0; i < resourceCounter.stream().filter(x -> WorkflowType.VNF == x.getResourceType()).collect(Collectors.toList()).size(); i++) { + flowsToExecute.add(buildExecuteBuildingBlock(orchFlow, requestId, resourceCounter.stream().filter(x -> WorkflowType.VNF == x.getResourceType()) + .collect(Collectors.toList()).get(i).getResourceId(), apiVersion, resourceId, + requestAction, aLaCarte, vnfType, workflowResourceIds, requestDetails, false)); + } + } else if (orchFlow.getFlowName().contains(NETWORK) + && !orchFlow.getFlowName().contains(NETWORKCOLLECTION)) { + for (int i = 0; i < resourceCounter.stream().filter(x -> WorkflowType.NETWORK == x.getResourceType()).collect(Collectors.toList()).size(); i++) { + flowsToExecute.add(buildExecuteBuildingBlock(orchFlow, requestId, resourceCounter.stream().filter(x -> WorkflowType.NETWORK == x.getResourceType()) + .collect(Collectors.toList()).get(i).getResourceId(), apiVersion, resourceId, + requestAction, aLaCarte, vnfType, workflowResourceIds, requestDetails, false)); + } + for (int i = 0; i < resourceCounter.stream().filter(x -> WorkflowType.VIRTUAL_LINK == x.getResourceType()).collect(Collectors.toList()).size(); i++) { + flowsToExecute.add(buildExecuteBuildingBlock(orchFlow, requestId, resourceCounter.stream().filter(x -> WorkflowType.VIRTUAL_LINK == x.getResourceType()) + .collect(Collectors.toList()).get(i).getResourceId(), apiVersion, resourceId, + requestAction, aLaCarte, vnfType, workflowResourceIds, requestDetails, true)); + } + } else if (orchFlow.getFlowName().contains(VFMODULE)) { + List<Resource> vfModuleResourcesSorted = sortVfModulesByBaseFirst(resourceCounter.stream().filter(x -> WorkflowType.VFMODULE == x.getResourceType()) + .collect(Collectors.toList())); + for (int i = 0; i < vfModuleResourcesSorted.size(); i++) { + flowsToExecute.add(buildExecuteBuildingBlock(orchFlow, requestId, vfModuleResourcesSorted.get(i).getResourceId(), apiVersion, resourceId, + requestAction, aLaCarte, vnfType, workflowResourceIds, requestDetails, false)); + } + } else if (orchFlow.getFlowName().contains(VOLUMEGROUP)) { + for (int i = 0; i < resourceCounter.stream().filter(x -> WorkflowType.VOLUMEGROUP == x.getResourceType()).collect(Collectors.toList()).size(); i++) { + flowsToExecute.add(buildExecuteBuildingBlock(orchFlow, requestId, resourceCounter.stream().filter(x -> WorkflowType.VOLUMEGROUP == x.getResourceType()) + .collect(Collectors.toList()).get(i).getResourceId(), apiVersion, resourceId, + requestAction, aLaCarte, vnfType, workflowResourceIds, requestDetails, false)); + } + } else if (orchFlow.getFlowName().contains(NETWORKCOLLECTION)) { + for (int i = 0; i < resourceCounter.stream().filter(x -> WorkflowType.NETWORKCOLLECTION == x.getResourceType()).collect(Collectors.toList()).size(); i++) { + flowsToExecute.add(buildExecuteBuildingBlock(orchFlow, requestId, resourceCounter.stream().filter(x -> WorkflowType.NETWORKCOLLECTION == x.getResourceType()) + .collect(Collectors.toList()).get(i).getResourceId(), apiVersion, resourceId, + requestAction, aLaCarte, vnfType, workflowResourceIds, requestDetails, false)); + } + } else { + flowsToExecute.add(buildExecuteBuildingBlock(orchFlow, requestId, "", apiVersion, resourceId, + requestAction, aLaCarte, vnfType, workflowResourceIds, requestDetails, false)); + } + } + return flowsToExecute; + } + + protected ExecuteBuildingBlock buildExecuteBuildingBlock(OrchestrationFlow orchFlow, String requestId, String key, + String apiVersion, String resourceId, String requestAction, boolean aLaCarte, String vnfType, + WorkflowResourceIds workflowResourceIds, RequestDetails requestDetails, boolean isVirtualLink) { + ExecuteBuildingBlock executeBuildingBlock = new ExecuteBuildingBlock(); + BuildingBlock buildingBlock = new BuildingBlock(); + buildingBlock.setBpmnFlowName(orchFlow.getFlowName()); + buildingBlock.setMsoId(UUID.randomUUID().toString()); + buildingBlock.setKey(key); + buildingBlock.setIsVirtualLink(isVirtualLink); + executeBuildingBlock.setApiVersion(apiVersion); + executeBuildingBlock.setaLaCarte(aLaCarte); + executeBuildingBlock.setRequestAction(requestAction); + executeBuildingBlock.setResourceId(resourceId); + executeBuildingBlock.setVnfType(vnfType); + executeBuildingBlock.setWorkflowResourceIds(workflowResourceIds); + executeBuildingBlock.setRequestId(requestId); + executeBuildingBlock.setBuildingBlock(buildingBlock); + executeBuildingBlock.setRequestDetails(requestDetails); + return executeBuildingBlock; + } + + protected List<OrchestrationFlow> queryNorthBoundRequestCatalogDb(DelegateExecution execution, String requestAction, + WorkflowType resourceName, boolean aLaCarte) { + List<OrchestrationFlow> listToExecute = new ArrayList<>(); + NorthBoundRequest northBoundRequest = catalogDbClient + .getNorthBoundRequestByActionAndIsALaCarteAndRequestScope(requestAction, resourceName.toString(), aLaCarte); + if(northBoundRequest == null){ + if(aLaCarte){ + buildAndThrowException(execution,"The request: ALaCarte " + resourceName + " " + requestAction + " is not supported by GR_API."); + }else{ + buildAndThrowException(execution,"The request: Macro " + resourceName + " " + requestAction + " is not supported by GR_API."); + } + } else { + if(northBoundRequest.getIsToplevelflow()!=null){ + execution.setVariable(G_ISTOPLEVELFLOW, northBoundRequest.getIsToplevelflow()); + } + List<OrchestrationFlow> flows = northBoundRequest.getOrchestrationFlowList(); + if (flows == null) + flows = new ArrayList<>(); + for (OrchestrationFlow flow : flows) { + if (!flow.getFlowName().contains("BB")) { + List<OrchestrationFlow> macroQueryFlows = catalogDbClient + .getOrchestrationFlowByAction(flow.getFlowName()); + for (OrchestrationFlow macroFlow : macroQueryFlows) { + listToExecute.add(macroFlow); + } + } else { + listToExecute.add(flow); + } + } + } + return listToExecute; + } + + protected void buildAndThrowException(DelegateExecution execution, String msg, Exception ex) { + msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, msg, "BPMN", MsoLogger.getServiceName(), + MsoLogger.ErrorCode.UnknownError, msg, ex); + execution.setVariable("WorkflowActionErrorMessage", msg); + exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, msg); + } + + protected void buildAndThrowException(DelegateExecution execution, String msg) { + msoLogger.error(msg); + execution.setVariable("WorkflowActionErrorMessage", msg); + exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, msg); + } + + public void handleRuntimeException (DelegateExecution execution){ + StringBuffer wfeExpMsg = new StringBuffer("Runtime error "); + String runtimeErrorMessage = null; + try{ + String javaExpMsg = (String) execution.getVariable("BPMN_javaExpMsg"); + if (javaExpMsg != null && !javaExpMsg.isEmpty()) { + wfeExpMsg = wfeExpMsg.append(": ").append(javaExpMsg); + } + runtimeErrorMessage = wfeExpMsg.toString(); + msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, runtimeErrorMessage, "BPMN", MsoLogger.getServiceName(), + MsoLogger.ErrorCode.UnknownError, runtimeErrorMessage); + execution.setVariable("WorkflowActionErrorMessage", runtimeErrorMessage); + } catch (Exception e){ + //if runtime message was mulformed + runtimeErrorMessage = "Runtime error"; + } + exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, runtimeErrorMessage); + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasks.java new file mode 100644 index 0000000000..ee6af61d0f --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasks.java @@ -0,0 +1,261 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.workflow.tasks; + +import java.util.ArrayList; +import java.util.List; + +import org.camunda.bpm.engine.delegate.BpmnError; +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.onap.so.bpmn.common.workflow.context.WorkflowCallbackResponse; +import org.onap.so.bpmn.common.workflow.context.WorkflowContextHolder; +import org.onap.so.bpmn.core.WorkflowException; +import org.onap.so.bpmn.servicedecomposition.entities.BuildingBlock; +import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock; +import org.onap.so.client.db.request.RequestsDbClient; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.db.request.beans.InfraActiveRequests; +import org.onap.so.logger.MsoLogger; +import org.onap.so.serviceinstancebeans.RequestReferences; +import org.onap.so.serviceinstancebeans.ServiceInstancesResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +@Component +public class WorkflowActionBBTasks { + + private static final String G_CURRENT_SEQUENCE = "gCurrentSequence"; + private static final String G_REQUEST_ID = "mso-request-id"; + private static final String G_ALACARTE = "aLaCarte"; + private static final String G_ACTION = "requestAction"; + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, WorkflowActionBBTasks.class); + + @Autowired + private RequestsDbClient requestDbclient; + @Autowired + private WorkflowAction workflowAction; + + public void selectBB(DelegateExecution execution) { + List<ExecuteBuildingBlock> flowsToExecute = (List<ExecuteBuildingBlock>) execution + .getVariable("flowsToExecute"); + execution.setVariable("MacroRollback", false); + int currentSequence = (int) execution.getVariable(G_CURRENT_SEQUENCE); + ExecuteBuildingBlock ebb = flowsToExecute.get(currentSequence); + boolean homing = (boolean) execution.getVariable("homing"); + boolean calledHoming = (boolean) execution.getVariable("calledHoming"); + if (homing && !calledHoming) { + if (ebb.getBuildingBlock().getBpmnFlowName().equals("AssignVnfBB")) { + ebb.setHoming(true); + execution.setVariable("calledHoming", true); + } + } else { + ebb.setHoming(false); + } + execution.setVariable("buildingBlock", ebb); + currentSequence++; + if (currentSequence >= flowsToExecute.size()) { + execution.setVariable("completed", true); + } else { + execution.setVariable("completed", false); + execution.setVariable(G_CURRENT_SEQUENCE, currentSequence); + } + } + + public void sendSyncAck(DelegateExecution execution) { + final String requestId = (String) execution.getVariable(G_REQUEST_ID); + final String resourceId = (String) execution.getVariable("resourceId"); + ServiceInstancesResponse serviceInstancesResponse = new ServiceInstancesResponse(); + RequestReferences requestRef = new RequestReferences(); + requestRef.setInstanceId(resourceId); + requestRef.setRequestId(requestId); + serviceInstancesResponse.setRequestReferences(requestRef); + ObjectMapper mapper = new ObjectMapper(); + String jsonRequest = ""; + try { + jsonRequest = mapper.writeValueAsString(serviceInstancesResponse); + } catch (JsonProcessingException e) { + workflowAction.buildAndThrowException(execution, + "Could not marshall ServiceInstancesRequest to Json string to respond to API Handler.", e); + } + WorkflowCallbackResponse callbackResponse = new WorkflowCallbackResponse(); + callbackResponse.setStatusCode(200); + callbackResponse.setMessage("Success"); + callbackResponse.setResponse(jsonRequest); + String processKey = execution.getProcessEngineServices().getRepositoryService() + .getProcessDefinition(execution.getProcessDefinitionId()).getKey(); + WorkflowContextHolder.getInstance().processCallback(processKey, execution.getProcessInstanceId(), requestId, + callbackResponse); + msoLogger.info("Successfully sent sync ack."); + } + + public void sendErrorSyncAck(DelegateExecution execution) { + final String requestId = (String) execution.getVariable(G_REQUEST_ID); + try { + ExceptionBuilder exceptionBuilder = new ExceptionBuilder(); + String errorMsg = (String) execution.getVariable("WorkflowActionErrorMessage"); + if (errorMsg == null) { + errorMsg = "WorkflowAction failed unexpectedly."; + } + String processKey = exceptionBuilder.getProcessKey(execution); + String buildworkflowException = "<aetgt:WorkflowException xmlns:aetgt=\"http://org.onap/so/workflow/schema/v1\"><aetgt:ErrorMessage>" + + errorMsg + + "</aetgt:ErrorMessage><aetgt:ErrorCode>7000</aetgt:ErrorCode></aetgt:WorkflowException>"; + WorkflowCallbackResponse callbackResponse = new WorkflowCallbackResponse(); + callbackResponse.setStatusCode(500); + callbackResponse.setMessage("Fail"); + callbackResponse.setResponse(buildworkflowException); + WorkflowContextHolder.getInstance().processCallback(processKey, execution.getProcessInstanceId(), requestId, + callbackResponse); + execution.setVariable("sentSyncResponse", true); + } catch (Exception ex) { + msoLogger.debug(" Sending Sync Error Activity Failed. " + "\n" + ex.getMessage()); + } + } + + public void setupCompleteMsoProcess(DelegateExecution execution) { + final String requestId = (String) execution.getVariable(G_REQUEST_ID); + final String action = (String) execution.getVariable(G_ACTION); + final String resourceId = (String) execution.getVariable("resourceId"); + final boolean aLaCarte = (boolean) execution.getVariable(G_ALACARTE); + final String resourceName = (String) execution.getVariable("resourceName"); + final String source = (String) execution.getVariable("source"); + String macroAction = ""; + if (aLaCarte) { + macroAction = "ALaCarte-" + resourceName + "-" + action; + } else { + macroAction = "Macro-" + resourceName + "-" + action; + } + String msoCompletionRequest = "<aetgt:MsoCompletionRequest xmlns:aetgt=\"http://org.onap/so/workflow/schema/v1\" xmlns:ns=\"http://org.onap/so/request/types/v1\"><request-info xmlns=\"http://org.onap/so/infra/vnf-request/v1\"><request-id>" + + requestId + "</request-id><action>" + action + "</action><source>" + source + + "</source></request-info><status-message>" + macroAction + + " request was executed correctly.</status-message><serviceInstanceId>" + resourceId + + "</serviceInstanceId><mso-bpel-name>WorkflowActionBB</mso-bpel-name></aetgt:MsoCompletionRequest>"; + execution.setVariable("CompleteMsoProcessRequest", msoCompletionRequest); + execution.setVariable("mso-request-id", requestId); + execution.setVariable("mso-service-instance-id", resourceId); + } + + public void setupFalloutHandler(DelegateExecution execution) { + final String requestId = (String) execution.getVariable(G_REQUEST_ID); + final String action = (String) execution.getVariable(G_ACTION); + final String resourceId = (String) execution.getVariable("resourceId"); + String exceptionMsg = ""; + if (execution.getVariable("WorkflowActionErrorMessage") != null) { + exceptionMsg = (String) execution.getVariable("WorkflowActionErrorMessage"); + } else { + exceptionMsg = "Error in WorkflowAction"; + } + execution.setVariable("mso-service-instance-id", resourceId); + execution.setVariable("mso-request-id", requestId); + String falloutRequest = "<aetgt:FalloutHandlerRequest xmlns:aetgt=\"http://org.onap/so/workflow/schema/v1\"xmlns:ns=\"http://org.onap/so/request/types/v1\"xmlns:wfsch=\"http://org.onap/so/workflow/schema/v1\"><request-info xmlns=\"http://org.onap/so/infra/vnf-request/v1\"><request-id>" + + requestId + "</request-id><action>" + action + + "</action><source>VID</source></request-info><aetgt:WorkflowException xmlns:aetgt=\"http://org.onap/so/workflow/schema/v1\"><aetgt:ErrorMessage>" + + exceptionMsg + + "</aetgt:ErrorMessage><aetgt:ErrorCode>7000</aetgt:ErrorCode></aetgt:WorkflowException></aetgt:FalloutHandlerRequest>"; + execution.setVariable("falloutRequest", falloutRequest); + } + + public void checkRetryStatus(DelegateExecution execution) { + if (execution.getVariable("handlingCode") == "Retry") { + int currSequence = (int) execution.getVariable("gCurrentSequence"); + currSequence--; + execution.setVariable("gCurrentSequence", currSequence); + int currRetryCount = (int) execution.getVariable("retryCount"); + currRetryCount++; + execution.setVariable("retryCount", currRetryCount); + } + } + + /** + * Rollback will only handle Create/Activate/Assign Macro flows. Execute + * layer will rollback the flow its currently working on. + */ + public void rollbackExecutionPath(DelegateExecution execution) { + List<ExecuteBuildingBlock> flowsToExecute = (List<ExecuteBuildingBlock>) execution + .getVariable("flowsToExecute"); + List<ExecuteBuildingBlock> rollbackFlows = new ArrayList(); + int currentSequence = (int) execution.getVariable(G_CURRENT_SEQUENCE) - 1; + for (int i = flowsToExecute.size() - 1; i >= 0; i--) { + if (i >= currentSequence) { + flowsToExecute.remove(i); + } else { + ExecuteBuildingBlock ebb = flowsToExecute.get(i); + BuildingBlock bb = flowsToExecute.get(i).getBuildingBlock(); + String flowName = flowsToExecute.get(i).getBuildingBlock().getBpmnFlowName(); + if (flowName.contains("Assign")) { + flowName = "Unassign" + flowName.substring(7, flowName.length()); + } else if (flowName.contains("Create")) { + flowName = "Delete" + flowName.substring(6, flowName.length()); + } else if (flowName.contains("Activate")) { + flowName = "Deactivate" + flowName.substring(8, flowName.length()); + } + flowsToExecute.get(i).getBuildingBlock().setBpmnFlowName(flowName); + rollbackFlows.add(flowsToExecute.get(i)); + } + } + if (rollbackFlows.isEmpty()) + execution.setVariable("isRollbackNeeded", false); + else + execution.setVariable("isRollbackNeeded", true); + + execution.setVariable("flowsToExecute", rollbackFlows); + execution.setVariable("handlingCode", "PreformingRollback"); + } + + public void abortCallErrorHandling(DelegateExecution execution) { + String msg = "Flow has failed. Rainy day handler has decided to abort the process."; + Exception exception = new Exception(msg); + msoLogger.error(exception); + throw new BpmnError(msg); + } + + public void updateRequestStatusToFailed(DelegateExecution execution) { + try { + String requestId = (String) execution.getVariable(G_REQUEST_ID); + InfraActiveRequests request = requestDbclient.getInfraActiveRequestbyRequestId(requestId); + String errorMsg = null; + try { + WorkflowException exception = (WorkflowException) execution.getVariable("WorkflowException"); + request.setStatusMessage(exception.getErrorMessage()); + } catch (Exception ex) { + //log error and attempt to extact WorkflowExceptionMessage + msoLogger.error(ex); + } + if (errorMsg == null){ + try { + errorMsg = (String) execution.getVariable("WorkflowExceptionErrorMessage"); + request.setStatusMessage(errorMsg); + } catch (Exception ex) { + msoLogger.error(ex); + request.setStatusMessage("Unexpected Error in BPMN"); + } + } + request.setRequestStatus("FAILED"); + request.setLastModifiedBy("CamundaBPMN"); + requestDbclient.updateInfraActiveRequests(request); + } catch (Exception e) { + workflowAction.buildAndThrowException(execution, "Error Updating Request Database", e); + } + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowType.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowType.java new file mode 100644 index 0000000000..ff5ba152b9 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowType.java @@ -0,0 +1,53 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.infrastructure.workflow.tasks; + +public enum WorkflowType { + + SERVICE("Service"), + VNF("Vnf"), + VFMODULE("VfModule"), + VOLUMEGROUP("VolumeGroup"), + NETWORK("Network"), + VIRTUAL_LINK("VirtualLink"), + NETWORKCOLLECTION("NetworkCollection"), + CONFIGURATION("Configuration"); + + private final String type; + + private WorkflowType (String type){ + this.type = type; + } + + @Override + public String toString() { + return this.type; + } + + public static WorkflowType fromString (String text){ + for (WorkflowType x : WorkflowType.values()) { + if (x.type.equalsIgnoreCase(text)) { + return x; + } + } + return null; + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/sdno/tasks/SDNOHealthCheckTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/sdno/tasks/SDNOHealthCheckTasks.java new file mode 100644 index 0000000000..9075fcc3cf --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/sdno/tasks/SDNOHealthCheckTasks.java @@ -0,0 +1,73 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.bpmn.sdno.tasks; + +import java.util.Map; + +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.client.orchestration.SDNOHealthCheckResources; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class SDNOHealthCheckTasks { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, SDNOHealthCheckTasks.class); + @Autowired + private ExceptionBuilder exceptionUtil; + @Autowired + private ExtractPojosForBB extractPojosForBB; + @Autowired + private SDNOHealthCheckResources sdnoHealthCheckResources; + + public void sdnoHealthCheck(BuildingBlockExecution execution) { + boolean response = false; + try { + GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock(); + RequestContext requestContext = gBBInput.getRequestContext(); + + GenericVnf vnf = null; + Map<ResourceKey, String> lookupMap = execution.getLookupMap(); + for (Map.Entry<ResourceKey, String> entry : lookupMap.entrySet()) { + if (entry.getKey().equals(ResourceKey.GENERIC_VNF_ID)) { + vnf = extractPojosForBB.extractByKey(execution, entry.getKey(), entry.getValue()); + } + } + + response = sdnoHealthCheckResources.healthCheck(vnf, requestContext); + } + catch (Exception ex) { + msoLogger.error(ex); + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex.getMessage()); + } + + if (!response) { + msoLogger.error("SDNO Health Check failed"); + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "SDNO Health Check failed"); + } + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/aai/mapper/AAIObjectMapper.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/aai/mapper/AAIObjectMapper.java new file mode 100644 index 0000000000..373ed63fda --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/aai/mapper/AAIObjectMapper.java @@ -0,0 +1,297 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.aai.mapper; + +import org.modelmapper.ModelMapper; +import org.modelmapper.PropertyMap; +import org.onap.aai.domain.yang.RouteTargets; +import org.onap.so.bpmn.servicedecomposition.bbobjects.*; +import org.springframework.stereotype.Component; + +import java.util.List; +import org.modelmapper.Converter; +import org.modelmapper.spi.MappingContext; +import org.onap.so.bpmn.servicedecomposition.bbobjects.HostRoute; +import org.onap.so.bpmn.servicedecomposition.bbobjects.SegmentationAssignment; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CtagAssignment; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet; + +@Component +public class AAIObjectMapper { + private static final ModelMapper modelMapper = new ModelMapper(); + + public org.onap.aai.domain.yang.ServiceInstance mapServiceInstance (ServiceInstance serviceInstance){ + if (modelMapper.getTypeMap(ServiceInstance.class, org.onap.aai.domain.yang.ServiceInstance.class) == null) { + modelMapper.addMappings(new PropertyMap<ServiceInstance, org.onap.aai.domain.yang.ServiceInstance>(){ + @Override + protected void configure() { + map().setServiceType(source.getModelInfoServiceInstance().getServiceType()); + map().setServiceRole(source.getModelInfoServiceInstance().getServiceRole()); + map().setModelInvariantId(source.getModelInfoServiceInstance().getModelInvariantUuid()); + map().setModelVersionId(source.getModelInfoServiceInstance().getModelUuid()); + map().setEnvironmentContext(source.getModelInfoServiceInstance().getEnvironmentContext()); + map().setWorkloadContext(source.getModelInfoServiceInstance().getWorkloadContext()); + } + }); + } + + return modelMapper.map(serviceInstance,org.onap.aai.domain.yang.ServiceInstance.class); + } + + public org.onap.aai.domain.yang.Project mapProject (Project project){ + return modelMapper.map(project,org.onap.aai.domain.yang.Project.class); + } + + public org.onap.aai.domain.yang.ServiceSubscription mapServiceSubscription(ServiceSubscription serviceSubscription){ + return modelMapper.map(serviceSubscription,org.onap.aai.domain.yang.ServiceSubscription.class); + } + + public org.onap.aai.domain.yang.OwningEntity mapOwningEntity (OwningEntity owningEntity){ + return modelMapper.map(owningEntity,org.onap.aai.domain.yang.OwningEntity.class); + } + + public org.onap.aai.domain.yang.GenericVnf mapVnf (GenericVnf vnf){ + if (modelMapper.getTypeMap(GenericVnf.class, org.onap.aai.domain.yang.GenericVnf.class) == null) { + modelMapper.addMappings(new PropertyMap<GenericVnf, org.onap.aai.domain.yang.GenericVnf>(){ + @Override + protected void configure() { + map().setModelCustomizationId(source.getModelInfoGenericVnf().getModelCustomizationUuid()); + map().setModelInvariantId(source.getModelInfoGenericVnf().getModelInvariantUuid()); + map().setModelVersionId(source.getModelInfoGenericVnf().getModelUuid()); + map().setNfRole(source.getModelInfoGenericVnf().getNfRole()); + map().setNfType(source.getModelInfoGenericVnf().getNfType()); + map().setNfFunction(source.getModelInfoGenericVnf().getNfFunction()); + map().setNfNamingCode(source.getModelInfoGenericVnf().getNfNamingCode()); + } + }); + } + + return modelMapper.map(vnf, org.onap.aai.domain.yang.GenericVnf.class); + } + + public org.onap.aai.domain.yang.VfModule mapVfModule (VfModule vfModule){ + if (modelMapper.getTypeMap(VfModule.class, org.onap.aai.domain.yang.VfModule.class) == null) { + modelMapper.addMappings(new PropertyMap<VfModule, org.onap.aai.domain.yang.VfModule>(){ + @Override + protected void configure() { + map().setModelCustomizationId(source.getModelInfoVfModule().getModelCustomizationUUID()); + map().setModelInvariantId(source.getModelInfoVfModule().getModelInvariantUUID()); + map().setModelVersionId(source.getModelInfoVfModule().getModelUUID()); + map().setPersonaModelVersion(source.getModelInfoVfModule().getModelInvariantUUID()); + + } + }); + } + + return modelMapper.map(vfModule, org.onap.aai.domain.yang.VfModule.class); + } + + public org.onap.aai.domain.yang.VolumeGroup mapVolumeGroup(VolumeGroup volumeGroup) { + if (modelMapper.getTypeMap(VolumeGroup.class, org.onap.aai.domain.yang.VolumeGroup.class) == null) { + modelMapper.addMappings(new PropertyMap<VolumeGroup, org.onap.aai.domain.yang.VolumeGroup>(){ + @Override + protected void configure() { + map().setModelCustomizationId(source.getModelInfoVfModule().getModelCustomizationUUID()); + map().setVfModuleModelCustomizationId(source.getModelInfoVfModule().getModelCustomizationUUID()); + } + }); + } + return modelMapper.map(volumeGroup, org.onap.aai.domain.yang.VolumeGroup.class); + } + + public org.onap.aai.domain.yang.L3Network mapNetwork (L3Network l3Network){ + if (modelMapper.getTypeMap(L3Network.class, org.onap.aai.domain.yang.L3Network.class) == null) { + modelMapper.addMappings(new PropertyMap<L3Network, org.onap.aai.domain.yang.L3Network>(){ + @Override + protected void configure() { + map().setModelCustomizationId(source.getModelInfoNetwork().getModelCustomizationUUID()); + map().setModelInvariantId(source.getModelInfoNetwork().getModelInvariantUUID()); + map().setModelVersionId(source.getModelInfoNetwork().getModelUUID()); + map().setNetworkType(source.getModelInfoNetwork().getNetworkType()); + map().setNetworkRole(source.getModelInfoNetwork().getNetworkRole()); + map().setNetworkTechnology(source.getModelInfoNetwork().getNetworkTechnology()); + modelMapper.addConverter(convertSubnets); + modelMapper.addConverter(convertCtagAssignments); + modelMapper.addConverter(convertSegmentationAssignments); + } + }); + } + return modelMapper.map(l3Network, org.onap.aai.domain.yang.L3Network.class); + } + + public org.onap.aai.domain.yang.InstanceGroup mapInstanceGroup(InstanceGroup instanceGroup) { + if (modelMapper.getTypeMap(InstanceGroup.class, org.onap.aai.domain.yang.InstanceGroup.class) == null) { + modelMapper.addMappings(new PropertyMap<InstanceGroup, org.onap.aai.domain.yang.InstanceGroup>(){ + @Override + protected void configure() { + map().setInstanceGroupRole(source.getModelInfoInstanceGroup().getInstanceGroupRole()); + map().setModelInvariantId(source.getModelInfoInstanceGroup().getModelInvariantUUID()); + map().setModelVersionId(source.getModelInfoInstanceGroup().getModelUUID()); + map().setInstanceGroupType(source.getModelInfoInstanceGroup().getType()); + map().setDescription(source.getModelInfoInstanceGroup().getDescription()); + map().setInstanceGroupFunction(source.getModelInfoInstanceGroup().getFunction()); + } + }); + } + return modelMapper.map(instanceGroup, org.onap.aai.domain.yang.InstanceGroup.class); + } + + public org.onap.aai.domain.yang.Customer mapCustomer(Customer customer) { + return modelMapper.map(customer, org.onap.aai.domain.yang.Customer.class); + } + + public Converter<List<Subnet>, org.onap.aai.domain.yang.Subnets> convertSubnets = new Converter<List<Subnet>, org.onap.aai.domain.yang.Subnets>() { + public org.onap.aai.domain.yang.Subnets convert(MappingContext<List<Subnet>, org.onap.aai.domain.yang.Subnets> context) { + return mapToAAISubNets(context.getSource()); + } + }; + + public Converter<List<CtagAssignment>, org.onap.aai.domain.yang.CtagAssignments> convertCtagAssignments = new Converter<List<CtagAssignment>, org.onap.aai.domain.yang.CtagAssignments>() { + public org.onap.aai.domain.yang.CtagAssignments convert(MappingContext<List<CtagAssignment>, org.onap.aai.domain.yang.CtagAssignments> context) { + return mapToAAICtagAssignmentList(context.getSource()); + } + }; + + public Converter<List<SegmentationAssignment>, org.onap.aai.domain.yang.SegmentationAssignments> convertSegmentationAssignments = new Converter<List<SegmentationAssignment>, org.onap.aai.domain.yang.SegmentationAssignments>() { + public org.onap.aai.domain.yang.SegmentationAssignments convert(MappingContext<List<SegmentationAssignment>, org.onap.aai.domain.yang.SegmentationAssignments> context) { + return mapToAAISegmentationAssignmentList(context.getSource()); + } + }; + + public org.onap.aai.domain.yang.Subnets mapToAAISubNets(List<Subnet> subnetList) { + org.onap.aai.domain.yang.Subnets subnets = null; + + if (!subnetList.isEmpty()) { + subnets = new org.onap.aai.domain.yang.Subnets(); + org.onap.aai.domain.yang.Subnet subnet = null; + for (Subnet subnetSource : subnetList) { + subnet = new org.onap.aai.domain.yang.Subnet(); + subnet.setSubnetId(subnetSource.getSubnetId()); + subnet.setSubnetName(subnetSource.getSubnetName()); + subnet.setNeutronSubnetId(subnetSource.getNeutronSubnetId()); + subnet.setGatewayAddress(subnetSource.getGatewayAddress()); + subnet.setCidrMask(subnetSource.getCidrMask()); + subnet.setIpVersion(subnetSource.getIpVersion()); + subnet.setOrchestrationStatus(subnetSource.getOrchestrationStatus().toString()); + subnet.setCidrMask(subnetSource.getCidrMask()); + subnet.setDhcpEnabled(subnetSource.isDhcpEnabled()); + subnet.setDhcpStart(subnetSource.getDhcpStart()); + subnet.setDhcpEnd(subnetSource.getDhcpEnd()); + subnet.setSubnetRole(subnetSource.getSubnetRole()); + subnet.setIpAssignmentDirection(subnetSource.getIpAssignmentDirection()); + subnet.setSubnetSequence(subnetSource.getSubnetSequence()); + + org.onap.aai.domain.yang.HostRoutes hostRoutes = new org.onap.aai.domain.yang.HostRoutes(); + org.onap.aai.domain.yang.HostRoute hostRoute = null; + for (HostRoute hostRouteSource : subnetSource.getHostRoutes()) { + hostRoute = new org.onap.aai.domain.yang.HostRoute(); + hostRoute.setHostRouteId(hostRouteSource.getHostRouteId()); + hostRoute.setRoutePrefix(hostRouteSource.getRoutePrefix()); + hostRoute.setNextHop(hostRouteSource.getNextHop()); + hostRoute.setNextHopType(hostRouteSource.getNextHopType()); + hostRoutes.getHostRoute().add(hostRoute); + } + subnet.setHostRoutes(hostRoutes); + subnets.getSubnet().add(subnet); + } + } + return subnets; + } + + public org.onap.aai.domain.yang.CtagAssignments mapToAAICtagAssignmentList(List<CtagAssignment> ctagAssignmentsList) { + org.onap.aai.domain.yang.CtagAssignments ctagAssignments = null; + if (!ctagAssignmentsList.isEmpty()) { + ctagAssignments = new org.onap.aai.domain.yang.CtagAssignments(); + + org.onap.aai.domain.yang.CtagAssignment ctagAssignment = null; + for (CtagAssignment ctagAssignmentSource : ctagAssignmentsList) { + ctagAssignment = new org.onap.aai.domain.yang.CtagAssignment(); + ctagAssignment.setVlanIdInner(ctagAssignmentSource.getVlanIdInner()); + ctagAssignments.getCtagAssignment().add(ctagAssignment); + } + } + return ctagAssignments; + } + + public org.onap.aai.domain.yang.SegmentationAssignments mapToAAISegmentationAssignmentList(List<SegmentationAssignment> segmentationAssignmentList) { + org.onap.aai.domain.yang.SegmentationAssignments segmentationAssignments = null; + if (!segmentationAssignmentList.isEmpty()) { + segmentationAssignments = new org.onap.aai.domain.yang.SegmentationAssignments(); + org.onap.aai.domain.yang.SegmentationAssignment segmentationAssignment = null; + for (SegmentationAssignment segmentationAssignmentSource : segmentationAssignmentList) { + segmentationAssignment = new org.onap.aai.domain.yang.SegmentationAssignment(); + segmentationAssignment.setSegmentationId(segmentationAssignmentSource.getSegmentationId()); + segmentationAssignments.getSegmentationAssignment().add(segmentationAssignment); + } + } + return segmentationAssignments; + } + + public org.onap.aai.domain.yang.Configuration mapConfiguration(Configuration configuration) { + if (null == modelMapper.getTypeMap(Configuration.class, org.onap.aai.domain.yang.Configuration.class)) { + modelMapper.addMappings(new PropertyMap<Configuration, org.onap.aai.domain.yang.Configuration>(){ + @Override + protected void configure() { + map().setModelCustomizationId(source.getModelInfoConfiguration().getModelCustomizationId()); + map().setModelVersionId(source.getModelInfoConfiguration().getModelVersionId()); + map().setModelInvariantId(source.getModelInfoConfiguration().getModelInvariantId()); + } + }); + } + return modelMapper.map(configuration, org.onap.aai.domain.yang.Configuration.class); + } + + public org.onap.aai.domain.yang.Collection mapCollection (Collection networkCollection){ + if (modelMapper.getTypeMap(Collection.class, org.onap.aai.domain.yang.Collection.class) == null) { + modelMapper.addMappings(new PropertyMap<Collection, org.onap.aai.domain.yang.Collection>(){ + @Override + protected void configure() { + map().setModelInvariantId(source.getModelInfoCollection().getModelInvariantUUID()); + map().setModelVersionId(source.getModelInfoCollection().getModelVersionId()); + map().setCollectionName(source.getName()); + } + }); + } + return modelMapper.map(networkCollection, org.onap.aai.domain.yang.Collection.class); + } + + + public org.onap.aai.domain.yang.VpnBinding mapVpnBinding(VpnBinding vpnBinding) { + org.onap.aai.domain.yang.VpnBinding aaiVpnBinding = modelMapper.map(vpnBinding, org.onap.aai.domain.yang.VpnBinding.class); + mapRouteTargetToVpnBinding(aaiVpnBinding,vpnBinding); + return aaiVpnBinding; + } + + public org.onap.aai.domain.yang.RouteTarget mapRouteTarget(RouteTarget routeTarget) { + return modelMapper.map(routeTarget, org.onap.aai.domain.yang.RouteTarget.class); + } + + private void mapRouteTargetToVpnBinding(org.onap.aai.domain.yang.VpnBinding aaiVpnBinding, VpnBinding vpnBinding) { + if(vpnBinding.getRouteTargets() != null && !vpnBinding.getRouteTargets().isEmpty()) { + RouteTargets routeTargets = new RouteTargets(); + for (RouteTarget routeTarget : vpnBinding.getRouteTargets()) { + routeTargets.getRouteTarget().add(mapRouteTarget(routeTarget)); + } + aaiVpnBinding.setRouteTargets(routeTargets); + } + } + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/NetworkAdapterClient.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/NetworkAdapterClient.java new file mode 100644 index 0000000000..45f28df756 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/NetworkAdapterClient.java @@ -0,0 +1,47 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.adapter.network; + +import org.onap.so.adapters.nwrest.CreateNetworkRequest; +import org.onap.so.adapters.nwrest.CreateNetworkResponse; +import org.onap.so.adapters.nwrest.DeleteNetworkRequest; +import org.onap.so.adapters.nwrest.DeleteNetworkResponse; +import org.onap.so.adapters.nwrest.QueryNetworkResponse; +import org.onap.so.adapters.nwrest.RollbackNetworkRequest; +import org.onap.so.adapters.nwrest.RollbackNetworkResponse; +import org.onap.so.adapters.nwrest.UpdateNetworkRequest; +import org.onap.so.adapters.nwrest.UpdateNetworkResponse; + +public interface NetworkAdapterClient { + CreateNetworkResponse createNetwork(CreateNetworkRequest req) throws NetworkAdapterClientException; + + DeleteNetworkResponse deleteNetwork(String aaiNetworkId, DeleteNetworkRequest req) + throws NetworkAdapterClientException; + + RollbackNetworkResponse rollbackNetwork(String aaiNetworkId, RollbackNetworkRequest req) + throws NetworkAdapterClientException; + + QueryNetworkResponse queryNetwork(String aaiNetworkId, String cloudSiteId, String tenantId, String networkStackId, + boolean skipAAI, String requestId, String serviceInstanceId) throws NetworkAdapterClientException; + + UpdateNetworkResponse updateNetwork(String aaiNetworkId, UpdateNetworkRequest req) + throws NetworkAdapterClientException; +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/NetworkAdapterClientException.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/NetworkAdapterClientException.java new file mode 100644 index 0000000000..0492477cf6 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/NetworkAdapterClientException.java @@ -0,0 +1,35 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.adapter.network; + +public class NetworkAdapterClientException extends Exception { + + + /** + * + */ + private static final long serialVersionUID = 8040736661096488110L; + + public NetworkAdapterClientException(String message) { + super(message); + } + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/NetworkAdapterClientImpl.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/NetworkAdapterClientImpl.java new file mode 100644 index 0000000000..9b052b4484 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/NetworkAdapterClientImpl.java @@ -0,0 +1,122 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.adapter.network; + +import javax.ws.rs.InternalServerErrorException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.UriBuilder; + +import org.onap.so.adapters.nwrest.CreateNetworkRequest; +import org.onap.so.adapters.nwrest.CreateNetworkResponse; +import org.onap.so.adapters.nwrest.DeleteNetworkRequest; +import org.onap.so.adapters.nwrest.DeleteNetworkResponse; +import org.onap.so.adapters.nwrest.QueryNetworkResponse; +import org.onap.so.adapters.nwrest.RollbackNetworkRequest; +import org.onap.so.adapters.nwrest.RollbackNetworkResponse; +import org.onap.so.adapters.nwrest.UpdateNetworkRequest; +import org.onap.so.adapters.nwrest.UpdateNetworkResponse; +import org.onap.so.client.adapter.rest.AdapterRestClient; +import org.springframework.stereotype.Component; + +@Component +public class NetworkAdapterClientImpl implements NetworkAdapterClient { + + private final NetworkAdapterRestProperties props; + + public NetworkAdapterClientImpl() { + this.props = new NetworkAdapterRestProperties(); + } + + @Override + public CreateNetworkResponse createNetwork(CreateNetworkRequest req) throws NetworkAdapterClientException{ + try { + return new AdapterRestClient(this.props, this.getUri("").build()).post(req, + CreateNetworkResponse.class); + } catch (InternalServerErrorException e) { + throw new NetworkAdapterClientException(e.getMessage()); + } + } + + @Override + public DeleteNetworkResponse deleteNetwork(String aaiNetworkId, DeleteNetworkRequest req) throws NetworkAdapterClientException { + try { + return new AdapterRestClient(this.props, this.getUri("/" + aaiNetworkId).build()).delete(req, + DeleteNetworkResponse.class); + } catch (InternalServerErrorException e) { + throw new NetworkAdapterClientException(e.getMessage()); + } + } + + @Override + public RollbackNetworkResponse rollbackNetwork(String aaiNetworkId, RollbackNetworkRequest req) throws NetworkAdapterClientException { + try { + return new AdapterRestClient(this.props, this.getUri("/" + aaiNetworkId).build()).delete(req, + RollbackNetworkResponse.class); + } catch (InternalServerErrorException e) { + throw new NetworkAdapterClientException(e.getMessage()); + } + } + + @Override + public QueryNetworkResponse queryNetwork(String aaiNetworkId, String cloudSiteId, String tenantId, + String networkStackId, boolean skipAAI, String requestId, String serviceInstanceId) throws NetworkAdapterClientException { + UriBuilder builder = this.getUri("/" + aaiNetworkId); + if (cloudSiteId != null) { + builder.queryParam("cloudSiteId", cloudSiteId); + } + if (tenantId != null) { + builder.queryParam("tenantId", tenantId); + } + if (networkStackId != null) { + builder.queryParam("networkStackId", networkStackId); + } + + builder.queryParam("skipAAI", skipAAI); + + if (requestId != null) { + builder.queryParam("msoRequest.requestId", requestId); + } + if (serviceInstanceId != null) { + builder.queryParam("msoRequest.serviceInstanceId", serviceInstanceId); + } + try { + return new AdapterRestClient(this.props, builder.build(), MediaType.APPLICATION_XML, MediaType.APPLICATION_XML) + .get(QueryNetworkResponse.class).get(); + } catch (InternalServerErrorException e) { + throw new NetworkAdapterClientException(e.getMessage()); + } + } + + @Override + public UpdateNetworkResponse updateNetwork(String aaiNetworkId, UpdateNetworkRequest req) throws NetworkAdapterClientException { + try { + return new AdapterRestClient(this.props, this.getUri("/" + aaiNetworkId).build()).put(req, + UpdateNetworkResponse.class); + } catch (InternalServerErrorException e) { + throw new NetworkAdapterClientException(e.getMessage()); + } + } + + protected UriBuilder getUri(String path) { + return UriBuilder.fromPath(path); + } + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/NetworkAdapterRestProperties.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/NetworkAdapterRestProperties.java new file mode 100644 index 0000000000..9888dd3be2 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/NetworkAdapterRestProperties.java @@ -0,0 +1,53 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.adapter.network; + +import java.net.MalformedURLException; +import java.net.URL; + +import org.onap.so.bpmn.core.UrnPropertiesReader; +import org.onap.so.client.adapter.rest.AdapterRestProperties; + + +public class NetworkAdapterRestProperties implements AdapterRestProperties { + + public NetworkAdapterRestProperties() { + } + + @Override + public String getAuth() { + return UrnPropertiesReader.getVariable("mso.adapters.po.auth"); + } + @Override + public String getKey() { + return UrnPropertiesReader.getVariable("mso.msoKey"); + } + @Override + public URL getEndpoint() throws MalformedURLException { + return new URL(UrnPropertiesReader.getVariable("mso.adapters.network.rest.endpoint")); + } + + @Override + public String getSystemName() { + return "MSO"; + } + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/mapper/NetworkAdapterObjectMapper.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/mapper/NetworkAdapterObjectMapper.java new file mode 100644 index 0000000000..a1501da0e2 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/mapper/NetworkAdapterObjectMapper.java @@ -0,0 +1,341 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.adapter.network.mapper; + +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.modelmapper.ModelMapper; +import org.modelmapper.PropertyMap; +import org.onap.so.adapters.nwrest.ContrailNetwork; +import org.onap.so.adapters.nwrest.CreateNetworkRequest; +import org.onap.so.adapters.nwrest.CreateNetworkResponse; +import org.onap.so.adapters.nwrest.DeleteNetworkRequest; +import org.onap.so.adapters.nwrest.ProviderVlanNetwork; +import org.onap.so.adapters.nwrest.RollbackNetworkRequest; +import org.onap.so.adapters.nwrest.UpdateNetworkRequest; +import org.onap.so.bpmn.core.UrnPropertiesReader; +import org.onap.so.bpmn.servicedecomposition.bbobjects.*; +import org.onap.so.bpmn.servicedecomposition.generalobjects.OrchestrationContext; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoNetwork; +import org.onap.so.entity.MsoRequest; +import org.onap.so.openstack.beans.NetworkRollback; +import org.onap.so.openstack.beans.RouteTarget; +import org.onap.so.openstack.beans.Subnet; +import org.springframework.stereotype.Component; +import org.springframework.web.util.UriUtils; + +@Component +public class NetworkAdapterObjectMapper { + private static final ModelMapper modelMapper = new ModelMapper(); + private static String FORWARD_SLASH = "/"; + + public CreateNetworkRequest createNetworkRequestMapper(RequestContext requestContext, CloudRegion cloudRegion, OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, L3Network l3Network, Map<String, String> userInput, String cloudRegionPo, Customer customer) throws UnsupportedEncodingException { + CreateNetworkRequest createNetworkRequest = new CreateNetworkRequest(); + + //set cloudSiteId as determined for cloud region PO instead of cloudRegion.getLcpCloudRegionId() + createNetworkRequest.setCloudSiteId(cloudRegionPo); + createNetworkRequest.setTenantId(cloudRegion.getTenantId()); + createNetworkRequest.setNetworkId(l3Network.getNetworkId()); + createNetworkRequest.setNetworkName(l3Network.getNetworkName()); + //TODO fields not available + createNetworkRequest.setNetworkType(l3Network.getNetworkType()); + //createNetworkRequest.setNetworkTypeVersion(serviceInstance.getModelInfoServiceInstance().getModelVersion()); + ModelInfoNetwork modelInfoNetwork = l3Network.getModelInfoNetwork(); + if (modelInfoNetwork != null){ + createNetworkRequest.setModelCustomizationUuid(modelInfoNetwork.getModelCustomizationUUID()); + } + + //build and set Subnet list + createNetworkRequest.setSubnets(buildOpenstackSubnetList(l3Network)); + + //build and set provider Vlan Network + ProviderVlanNetwork providerVlanNetwork = buildProviderVlanNetwork(l3Network); + createNetworkRequest.setProviderVlanNetwork(providerVlanNetwork); + + //build and set Contrail Network + ContrailNetwork contrailNetwork = buildContrailNetwork(l3Network, customer); + createNetworkRequest.setContrailNetwork(contrailNetwork); + + //set Network Parameters from VID request + createNetworkRequest.setNetworkParams(userInput); + + createNetworkRequest = setFlowFlags(createNetworkRequest, orchestrationContext); + + createNetworkRequest.setMsoRequest(createMsoRequest(requestContext, serviceInstance)); + + String messageId = getRandomUuid(); + createNetworkRequest.setMessageId(messageId); + //TODO clarify callback URL build process + //createNetworkRequest.setNotificationUrl(createCallbackUrl("NetworkAResponse", messageId)); + + return createNetworkRequest; + } + + public DeleteNetworkRequest deleteNetworkRequestMapper(RequestContext requestContext, CloudRegion cloudRegion, ServiceInstance serviceInstance, L3Network l3Network) throws UnsupportedEncodingException { + DeleteNetworkRequest deleteNetworkRequest = new DeleteNetworkRequest(); + + deleteNetworkRequest.setCloudSiteId(cloudRegion.getLcpCloudRegionId()); + + String messageId = getRandomUuid(); + deleteNetworkRequest.setMessageId(messageId); + + ModelInfoNetwork modelInfoNetwork = l3Network.getModelInfoNetwork(); + if (modelInfoNetwork != null){ + deleteNetworkRequest.setModelCustomizationUuid(modelInfoNetwork.getModelCustomizationUUID()); + } + + deleteNetworkRequest.setMsoRequest(createMsoRequest(requestContext, serviceInstance)); + deleteNetworkRequest.setNetworkId(l3Network.getNetworkId()); + deleteNetworkRequest.setNetworkStackId(l3Network.getHeatStackId()); + deleteNetworkRequest.setNetworkType(l3Network.getNetworkType()); + deleteNetworkRequest.setSkipAAI(true); + deleteNetworkRequest.setTenantId(cloudRegion.getTenantId()); + + return deleteNetworkRequest; + } + + /** + * Access method to build Rollback Network Request + * @return + * @throws UnsupportedEncodingException + */ + public RollbackNetworkRequest createNetworkRollbackRequestMapper(RequestContext requestContext, CloudRegion cloudRegion, OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, L3Network l3Network, Map<String, String> userInput, String cloudRegionPo, CreateNetworkResponse createNetworkResponse) throws UnsupportedEncodingException { + RollbackNetworkRequest rollbackNetworkRequest = new RollbackNetworkRequest(); + + rollbackNetworkRequest = setCommonRollbackRequestFields(rollbackNetworkRequest, requestContext); + + NetworkRollback networkRollback = buildNetworkRollback(l3Network, cloudRegion, cloudRegionPo, createNetworkResponse); + rollbackNetworkRequest.setNetworkRollback(networkRollback); + + return rollbackNetworkRequest; + } + + public UpdateNetworkRequest createNetworkUpdateRequestMapper(RequestContext requestContext, CloudRegion cloudRegion, OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, L3Network l3Network, Map<String, String> userInput, Customer customer) throws UnsupportedEncodingException { + UpdateNetworkRequest updateNetworkRequest = new UpdateNetworkRequest(); + + updateNetworkRequest.setCloudSiteId(cloudRegion.getLcpCloudRegionId()); + updateNetworkRequest.setTenantId(cloudRegion.getTenantId()); + updateNetworkRequest.setNetworkId(l3Network.getNetworkId()); + updateNetworkRequest.setNetworkStackId(l3Network.getHeatStackId()); + updateNetworkRequest.setNetworkName(l3Network.getNetworkName()); + updateNetworkRequest.setNetworkType(l3Network.getModelInfoNetwork().getNetworkType()); + updateNetworkRequest.setNetworkTypeVersion(l3Network.getModelInfoNetwork().getModelVersion()); + updateNetworkRequest.setModelCustomizationUuid(l3Network.getModelInfoNetwork().getModelCustomizationUUID()); + updateNetworkRequest.setSubnets(buildOpenstackSubnetList(l3Network)); + updateNetworkRequest.setProviderVlanNetwork(buildProviderVlanNetwork(l3Network)); + updateNetworkRequest.setContrailNetwork(buildContrailNetwork(l3Network, customer)); + updateNetworkRequest.setNetworkParams(userInput); + updateNetworkRequest.setMsoRequest(createMsoRequest(requestContext, serviceInstance)); + + setFlowFlags(updateNetworkRequest, orchestrationContext); + + String messageId = getRandomUuid(); + updateNetworkRequest.setMessageId(messageId); + updateNetworkRequest.setNotificationUrl(createCallbackUrl("NetworkAResponse", messageId)); + + return updateNetworkRequest; + } + + private RollbackNetworkRequest setCommonRollbackRequestFields(RollbackNetworkRequest request,RequestContext requestContext){ + //TODO confirm flag value + request.setSkipAAI(true); + request.setMessageId(requestContext.getMsoRequestId()); + //TODO clarify callback URL build process. This will also set SYNC flag + //request.setNotificationUrl(createCallbackUrl("NetworkAResponse", messageId)); + return request; + } + + private NetworkRollback buildNetworkRollback(L3Network l3Network, CloudRegion cloudRegion, String cloudRegionPo, CreateNetworkResponse createNetworkResponse){ + NetworkRollback networkRollback = new NetworkRollback(); + networkRollback.setNetworkId(l3Network.getNetworkId()); + networkRollback.setNeutronNetworkId(createNetworkResponse.getMessageId()); + networkRollback.setNetworkStackId(createNetworkResponse.getNetworkStackId()); + networkRollback.setTenantId(cloudRegion.getTenantId()); + networkRollback.setCloudId(cloudRegionPo); + networkRollback.setNetworkType(l3Network.getNetworkType()); + ModelInfoNetwork modelInfoNetwork = l3Network.getModelInfoNetwork(); + if (modelInfoNetwork != null){ + networkRollback.setModelCustomizationUuid(modelInfoNetwork.getModelCustomizationUUID()); + } + //rollback will only be called when network was actually created + networkRollback.setNetworkCreated(createNetworkResponse.getNetworkCreated()); + //TODO confirm below not required for create rollback + //NetworkName + //PhysicalNetwork + //Vlans + //msoRequest + return networkRollback; + } + + public MsoRequest createMsoRequest(RequestContext requestContext, ServiceInstance serviceInstance) { + MsoRequest msoRequest = new MsoRequest(); + msoRequest.setRequestId(requestContext.getMsoRequestId()); + msoRequest.setServiceInstanceId(serviceInstance.getServiceInstanceId()); + return msoRequest; + } + + protected String getRandomUuid() { + return UUID.randomUUID().toString(); + } + + protected String createCallbackUrl(String messageType, String correlator) throws UnsupportedEncodingException { + String endpoint = this.getEndpoint(); + + while (endpoint.endsWith("/")) { + endpoint = endpoint.substring(0, endpoint.length()-1); + } + return endpoint + "/" + UriUtils.encodePathSegment(messageType, "UTF-8") + "/" + UriUtils.encodePathSegment(correlator, "UTF-8"); + } + + protected String getEndpoint() { + return UrnPropertiesReader.getVariable("mso.workflow.message.endpoint"); + } + /** + * Use BB L3Network object to build subnets list of type org.onap.so.openstack.beans.Subnet + * @param L3Network + * @return List<org.onap.so.openstack.beans.Subnet> + */ + private List<Subnet> buildOpenstackSubnetList(L3Network l3Network){ + + List<org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet> subnets = l3Network.getSubnets(); + List<org.onap.so.openstack.beans.Subnet> subnetList = new ArrayList<org.onap.so.openstack.beans.Subnet>(); + //create mapper from onap Subnet to openstack bean Subnet + if(modelMapper.getTypeMap(org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet.class, org.onap.so.openstack.beans.Subnet.class) == null) { + PropertyMap<org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet, org.onap.so.openstack.beans.Subnet> personMap = new PropertyMap<org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet, org.onap.so.openstack.beans.Subnet>() { + protected void configure() { + map().setSubnetName(source.getSubnetName()); + map(source.getSubnetId(), destination.getSubnetId()); + map(source.getNeutronSubnetId(), destination.getNeutronId()); + map(source.getGatewayAddress(), destination.getGatewayIp()); + map(source.getIpVersion(), destination.getIpVersion()); + map(source.isDhcpEnabled(), destination.getEnableDHCP()); + } + }; + modelMapper.addMappings(personMap); + } + + for (org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet subnet : subnets) { + org.onap.so.openstack.beans.Subnet openstackSubnet = modelMapper.map(subnet, org.onap.so.openstack.beans.Subnet.class); + //update cidr value + if (subnet.getNetworkStartAddress() != null & subnet.getCidrMask() != null) + openstackSubnet.setCidr(subnet.getNetworkStartAddress().concat(FORWARD_SLASH).concat(subnet.getCidrMask())); + List<org.onap.so.bpmn.servicedecomposition.bbobjects.HostRoute> hostRouteList = subnet.getHostRoutes(); + List<org.onap.so.openstack.beans.HostRoute> openstackHostRouteList = new ArrayList<>(); + org.onap.so.openstack.beans.HostRoute openstackHostRoute = new org.onap.so.openstack.beans.HostRoute(); + //TODO only 2 fields available on openstack object. Confirm it is sufficient or add as needed + for (org.onap.so.bpmn.servicedecomposition.bbobjects.HostRoute hostRoute : hostRouteList) { + openstackHostRoute.setNextHop(hostRoute.getNextHop()); + openstackHostRoute.setPrefix(hostRoute.getRoutePrefix()); + //add host route to the list + openstackHostRouteList.add(openstackHostRoute); + } + openstackSubnet.setHostRoutes(openstackHostRouteList); + //add subnet to the list + subnetList.add(openstackSubnet); + } + return subnetList; + } + + private ProviderVlanNetwork buildProviderVlanNetwork(L3Network l3Network){ + ProviderVlanNetwork providerVlanNetwork = new ProviderVlanNetwork(); + providerVlanNetwork.setPhysicalNetworkName(l3Network.getPhysicalNetworkName()); + List<Integer> vlans = new ArrayList<Integer>(); + List<org.onap.so.bpmn.servicedecomposition.bbobjects.SegmentationAssignment> segmentationAssignments = l3Network.getSegmentationAssignments(); + for (org.onap.so.bpmn.servicedecomposition.bbobjects.SegmentationAssignment assignment : segmentationAssignments) { + vlans.add(Integer.valueOf(assignment.getSegmentationId())); + } + providerVlanNetwork.setVlans(vlans); + return providerVlanNetwork; + } + + private ContrailNetwork buildContrailNetwork(L3Network l3Network, Customer customer){ + ContrailNetwork contrailNetwork = new ContrailNetwork(); + contrailNetwork.setExternal(Boolean.toString(l3Network.isExternalNetwork())); + contrailNetwork.setShared(Boolean.toString(l3Network.isSharedNetwork())); + contrailNetwork.setPolicyFqdns(buildPolicyFqdns(l3Network.getNetworkPolicies())); + contrailNetwork.setRouteTableFqdns(buildRouteTableFqdns(l3Network.getContrailNetworkRouteTableReferences())); + if(customer!= null) + contrailNetwork.setRouteTargets(buildRouteTargets(customer.getVpnBindings())); + //PolicyFqdns(policyFqdns); --- is set in getAAINetworkPolicy + //RouteTableFqdns(routeTableFqdns); --- is set in getAAINetworkTableRef + //RouteTargets(routeTargets); --- is set in getAAINetworkVpnBinding + return contrailNetwork; + } + + private List<String> buildPolicyFqdns(List<NetworkPolicy> networkPolicies) { + List<String> policyFqdns = new ArrayList<>(); + for(NetworkPolicy networkPolicy : networkPolicies) { + policyFqdns.add(networkPolicy.getNetworkPolicyFqdn()); + } + return policyFqdns; + } + + private List<String> buildRouteTableFqdns(List<RouteTableReference> contrailNetworkRouteTableReferences) { + List<String> routeTableFqdns = new ArrayList<>(); + for(RouteTableReference routeTableReference : contrailNetworkRouteTableReferences) { + routeTableFqdns.add(routeTableReference.getRouteTableReferenceFqdn()); + } + return routeTableFqdns; + } + + private List<RouteTarget> buildRouteTargets(List<VpnBinding> vpnBindings) { + if(modelMapper.getTypeMap(org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTarget.class, RouteTarget.class) == null) { + modelMapper.addMappings(new PropertyMap<org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTarget, RouteTarget>() { + @Override + protected void configure() { + map().setRouteTarget(source.getGlobalRouteTarget()); + map().setRouteTargetRole(source.getRouteTargetRole()); + } + }); + } + + List<RouteTarget> routeTargets = new ArrayList<>(); + for(VpnBinding vpnBinding : vpnBindings) { + for(org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTarget routeTarget : vpnBinding.getRouteTargets()) { + routeTargets.add(modelMapper.map(routeTarget, RouteTarget.class)); + } + } + return routeTargets; + } + + private CreateNetworkRequest setFlowFlags(CreateNetworkRequest createNetworkRequest, OrchestrationContext orchestrationContext){ + //TODO confirm flag value + createNetworkRequest.setSkipAAI(true); + //revert suppressRollabck=TRUE into backout=FALSE and vice versa + createNetworkRequest.setBackout(orchestrationContext.getIsRollbackEnabled()); + //TODO confirm value - false by default + createNetworkRequest.setFailIfExists(true); + //NetworkTechnology(NetworkTechnology.NEUTRON); NOOP - default + return createNetworkRequest; + } + + private void setFlowFlags(UpdateNetworkRequest updateNetworkRequest, OrchestrationContext orchestrationContext){ + updateNetworkRequest.setSkipAAI(true); + //revert suppressRollabck=TRUE into backout=FALSE and vice versa + updateNetworkRequest.setBackout(!Boolean.valueOf(orchestrationContext.getIsRollbackEnabled())); + //NetworkTechnology(NetworkTechnology.NEUTRON); NOOP - default + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/VnfAdapterClient.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/VnfAdapterClient.java new file mode 100644 index 0000000000..13739faec2 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/VnfAdapterClient.java @@ -0,0 +1,49 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.adapter.vnf; + +import org.onap.so.adapters.vnfrest.CreateVfModuleRequest; +import org.onap.so.adapters.vnfrest.CreateVfModuleResponse; +import org.onap.so.adapters.vnfrest.DeleteVfModuleRequest; +import org.onap.so.adapters.vnfrest.DeleteVfModuleResponse; +import org.onap.so.adapters.vnfrest.QueryVfModuleResponse; +import org.onap.so.adapters.vnfrest.RollbackVfModuleRequest; +import org.onap.so.adapters.vnfrest.RollbackVfModuleResponse; +import org.onap.so.adapters.vnfrest.UpdateVfModuleRequest; +import org.onap.so.adapters.vnfrest.UpdateVfModuleResponse; + +public interface VnfAdapterClient { + + CreateVfModuleResponse createVfModule(String aaiVnfId, CreateVfModuleRequest req) throws VnfAdapterClientException; + + RollbackVfModuleResponse rollbackVfModule(String aaiVnfId, String aaiVfModuleId, RollbackVfModuleRequest req) + throws VnfAdapterClientException; + + DeleteVfModuleResponse deleteVfModule(String aaiVnfId, String aaiVfModuleId, DeleteVfModuleRequest req) + throws VnfAdapterClientException; + + UpdateVfModuleResponse updateVfModule(String aaiVnfId, String aaiVfModuleId, UpdateVfModuleRequest req) + throws VnfAdapterClientException; + + QueryVfModuleResponse queryVfModule(String aaiVnfId, String aaiVfModuleId, String cloudSiteId, String tenantId, + String vfModuleName, boolean skipAAI, String requestId, String serviceInstanceId) + throws VnfAdapterClientException; +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/VnfAdapterClientException.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/VnfAdapterClientException.java new file mode 100644 index 0000000000..b4ad9ef055 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/VnfAdapterClientException.java @@ -0,0 +1,34 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.adapter.vnf; + +public class VnfAdapterClientException extends Exception { + + /** + * + */ + private static final long serialVersionUID = -7154784472485852602L; + + public VnfAdapterClientException(String message) { + super(message); + } + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/VnfAdapterClientImpl.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/VnfAdapterClientImpl.java new file mode 100644 index 0000000000..7b9a8c5312 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/VnfAdapterClientImpl.java @@ -0,0 +1,134 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.adapter.vnf; + +import javax.ws.rs.InternalServerErrorException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.UriBuilder; + +import org.onap.so.adapters.vnfrest.CreateVfModuleRequest; +import org.onap.so.adapters.vnfrest.CreateVfModuleResponse; +import org.onap.so.adapters.vnfrest.DeleteVfModuleRequest; +import org.onap.so.adapters.vnfrest.DeleteVfModuleResponse; +import org.onap.so.adapters.vnfrest.QueryVfModuleResponse; +import org.onap.so.adapters.vnfrest.RollbackVfModuleRequest; +import org.onap.so.adapters.vnfrest.RollbackVfModuleResponse; +import org.onap.so.adapters.vnfrest.UpdateVfModuleRequest; +import org.onap.so.adapters.vnfrest.UpdateVfModuleResponse; +import org.onap.so.client.adapter.rest.AdapterRestClient; +import org.springframework.stereotype.Component; + +@Component +public class VnfAdapterClientImpl implements VnfAdapterClient { + + private static final String VF_MODULES = "/vf-modules/"; + + private VnfAdapterRestProperties props; + + public VnfAdapterClientImpl() { + this.props = new VnfAdapterRestProperties(); + } + + public VnfAdapterClientImpl(VnfAdapterRestProperties props) { + this.props = props; + } + + @Override + public CreateVfModuleResponse createVfModule(String aaiVnfId, CreateVfModuleRequest req) + throws VnfAdapterClientException { + try { + return new AdapterRestClient(this.props, this.getUri("/" + aaiVnfId + "/vf-modules").build()).post(req, + CreateVfModuleResponse.class); + } catch (InternalServerErrorException e) { + throw new VnfAdapterClientException(e.getMessage()); + } + } + + @Override + public RollbackVfModuleResponse rollbackVfModule(String aaiVnfId, String aaiVfModuleId, RollbackVfModuleRequest req) + throws VnfAdapterClientException { + try { + return new AdapterRestClient(this.props, + this.getUri("/" + aaiVnfId + VF_MODULES + aaiVfModuleId + "/rollback").build()).delete(req, + RollbackVfModuleResponse.class); + } catch (InternalServerErrorException e) { + throw new VnfAdapterClientException(e.getMessage()); + } + } + + @Override + public DeleteVfModuleResponse deleteVfModule(String aaiVnfId, String aaiVfModuleId, DeleteVfModuleRequest req) + throws VnfAdapterClientException { + try { + return new AdapterRestClient(this.props, this.getUri("/" + aaiVnfId + VF_MODULES + aaiVfModuleId).build()) + .delete(req, DeleteVfModuleResponse.class); + } catch (InternalServerErrorException e) { + throw new VnfAdapterClientException(e.getMessage()); + } + } + + @Override + public UpdateVfModuleResponse updateVfModule(String aaiVnfId, String aaiVfModuleId, UpdateVfModuleRequest req) + throws VnfAdapterClientException { + try { + return new AdapterRestClient(this.props, this.getUri("/" + aaiVnfId + VF_MODULES + aaiVfModuleId).build()) + .put(req, UpdateVfModuleResponse.class); + } catch (InternalServerErrorException e) { + throw new VnfAdapterClientException(e.getMessage()); + } + } + + @Override + public QueryVfModuleResponse queryVfModule(String aaiVnfId, String aaiVfModuleId, String cloudSiteId, + String tenantId, String vfModuleName, boolean skipAAI, String requestId, String serviceInstanceId) + throws VnfAdapterClientException { + UriBuilder builder = this.getUri("/" + aaiVnfId + VF_MODULES + aaiVfModuleId); + if (cloudSiteId != null) { + builder.queryParam("cloudSiteId", cloudSiteId); + } + if (tenantId != null) { + builder.queryParam("tenantId", tenantId); + } + if (vfModuleName != null) { + builder.queryParam("vfModuleName", vfModuleName); + } + + builder.queryParam("skipAAI", skipAAI); + + if (requestId != null) { + builder.queryParam("msoRequest.requestId", requestId); + } + if (serviceInstanceId != null) { + builder.queryParam("msoRequest.serviceInstanceId", serviceInstanceId); + } + try { + return new AdapterRestClient(this.props, builder.build(), MediaType.APPLICATION_JSON, + MediaType.APPLICATION_JSON).get(QueryVfModuleResponse.class).get(); + } catch (InternalServerErrorException e) { + throw new VnfAdapterClientException(e.getMessage()); + } + } + + public UriBuilder getUri(String path) { + return UriBuilder.fromPath(path); + } + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/VnfAdapterRestProperties.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/VnfAdapterRestProperties.java new file mode 100644 index 0000000000..8302375c7e --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/VnfAdapterRestProperties.java @@ -0,0 +1,54 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.adapter.vnf; + +import java.net.MalformedURLException; +import java.net.URL; + +import org.onap.so.bpmn.core.UrnPropertiesReader; +import org.onap.so.client.adapter.rest.AdapterRestProperties; + + +public class VnfAdapterRestProperties implements AdapterRestProperties { + + + public VnfAdapterRestProperties() { + } + + @Override + public String getAuth() { + return UrnPropertiesReader.getVariable("mso.adapters.po.auth"); + } + @Override + public String getKey() { + return UrnPropertiesReader.getVariable("mso.msoKey"); + } + @Override + public URL getEndpoint() throws MalformedURLException { + return new URL(UrnPropertiesReader.getVariable("mso.adapters.vnf.rest.endpoint")); + } + + @Override + public String getSystemName() { + return "MSO"; + } + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/VnfVolumeAdapterClient.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/VnfVolumeAdapterClient.java new file mode 100644 index 0000000000..0626efbd03 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/VnfVolumeAdapterClient.java @@ -0,0 +1,48 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.adapter.vnf; + +import org.onap.so.adapters.vnfrest.CreateVolumeGroupRequest; +import org.onap.so.adapters.vnfrest.CreateVolumeGroupResponse; +import org.onap.so.adapters.vnfrest.DeleteVolumeGroupRequest; +import org.onap.so.adapters.vnfrest.DeleteVolumeGroupResponse; +import org.onap.so.adapters.vnfrest.QueryVolumeGroupResponse; +import org.onap.so.adapters.vnfrest.RollbackVolumeGroupRequest; +import org.onap.so.adapters.vnfrest.RollbackVolumeGroupResponse; +import org.onap.so.adapters.vnfrest.UpdateVolumeGroupRequest; +import org.onap.so.adapters.vnfrest.UpdateVolumeGroupResponse; + +public interface VnfVolumeAdapterClient { + CreateVolumeGroupResponse createVNFVolumes(CreateVolumeGroupRequest req) throws VnfAdapterClientException; + + DeleteVolumeGroupResponse deleteVNFVolumes(String aaiVolumeGroupId, DeleteVolumeGroupRequest req) + throws VnfAdapterClientException; + + RollbackVolumeGroupResponse rollbackVNFVolumes(String aaiVolumeGroupId, RollbackVolumeGroupRequest req) + throws VnfAdapterClientException; + + UpdateVolumeGroupResponse updateVNFVolumes(String aaiVolumeGroupId, UpdateVolumeGroupRequest req) + throws VnfAdapterClientException; + + QueryVolumeGroupResponse queryVNFVolumes(String aaiVolumeGroupId, String cloudSiteId, String tenantId, + String volumeGroupStackId, Boolean skipAAI, String requestId, String serviceInstanceId) + throws VnfAdapterClientException; +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/VnfVolumeAdapterClientImpl.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/VnfVolumeAdapterClientImpl.java new file mode 100644 index 0000000000..0e0fd3bb5d --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/VnfVolumeAdapterClientImpl.java @@ -0,0 +1,120 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.adapter.vnf; + +import javax.ws.rs.InternalServerErrorException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.UriBuilder; + +import org.onap.so.adapters.vnfrest.CreateVolumeGroupRequest; +import org.onap.so.adapters.vnfrest.CreateVolumeGroupResponse; +import org.onap.so.adapters.vnfrest.DeleteVolumeGroupRequest; +import org.onap.so.adapters.vnfrest.DeleteVolumeGroupResponse; +import org.onap.so.adapters.vnfrest.QueryVolumeGroupResponse; +import org.onap.so.adapters.vnfrest.RollbackVolumeGroupRequest; +import org.onap.so.adapters.vnfrest.RollbackVolumeGroupResponse; +import org.onap.so.adapters.vnfrest.UpdateVolumeGroupRequest; +import org.onap.so.adapters.vnfrest.UpdateVolumeGroupResponse; +import org.onap.so.client.RestClient; +import org.onap.so.client.adapter.rest.AdapterRestClient; +import org.springframework.stereotype.Component; + +@Component +public class VnfVolumeAdapterClientImpl implements VnfVolumeAdapterClient { + + private final VnfVolumeAdapterRestProperties props; + + public VnfVolumeAdapterClientImpl() { + this.props = new VnfVolumeAdapterRestProperties(); + } + + @Override + public CreateVolumeGroupResponse createVNFVolumes(CreateVolumeGroupRequest req) throws VnfAdapterClientException { + try { + return this.getAdapterRestClient("").post(req, CreateVolumeGroupResponse.class); + } catch (InternalServerErrorException e) { + throw new VnfAdapterClientException(e.getMessage()); + } + } + + @Override + public DeleteVolumeGroupResponse deleteVNFVolumes(String aaiVolumeGroupId, DeleteVolumeGroupRequest req) + throws VnfAdapterClientException { + try { + return this.getAdapterRestClient("/" + aaiVolumeGroupId).delete(req, DeleteVolumeGroupResponse.class); + } catch (InternalServerErrorException e) { + throw new VnfAdapterClientException(e.getMessage()); + } + } + + @Override + public RollbackVolumeGroupResponse rollbackVNFVolumes(String aaiVolumeGroupId, RollbackVolumeGroupRequest req) + throws VnfAdapterClientException { + try { + return this.getAdapterRestClient("/" + aaiVolumeGroupId + "/rollback").delete(req, + RollbackVolumeGroupResponse.class); + } catch (InternalServerErrorException e) { + throw new VnfAdapterClientException(e.getMessage()); + } + } + + @Override + public UpdateVolumeGroupResponse updateVNFVolumes(String aaiVolumeGroupId, UpdateVolumeGroupRequest req) + throws VnfAdapterClientException { + try { + return this.getAdapterRestClient("/" + aaiVolumeGroupId).put(req, UpdateVolumeGroupResponse.class); + } catch (InternalServerErrorException e) { + throw new VnfAdapterClientException(e.getMessage()); + } + } + + @Override + public QueryVolumeGroupResponse queryVNFVolumes(String aaiVolumeGroupId, String cloudSiteId, String tenantId, + String volumeGroupStackId, Boolean skipAAI, String requestId, String serviceInstanceId) + throws VnfAdapterClientException { + try { + String path = buildQueryPath(aaiVolumeGroupId, cloudSiteId, tenantId, volumeGroupStackId, skipAAI, + requestId, serviceInstanceId); + return this.getAdapterRestClient(path).get(QueryVolumeGroupResponse.class).get(); + } catch (InternalServerErrorException e) { + throw new VnfAdapterClientException(e.getMessage()); + } + } + + protected String buildQueryPath(String aaiVolumeGroupId, String cloudSiteId, String tenantId, + String volumeGroupStackId, Boolean skipAAI, String requestId, String serviceInstanceId) { + javax.ws.rs.core.UriBuilder builder = this.getUri("/" + aaiVolumeGroupId); + builder.queryParam("cloudSiteId", cloudSiteId).queryParam("tenantId", tenantId) + .queryParam("volumeGroupStackId", volumeGroupStackId).queryParam("skipAAI", skipAAI) + .queryParam("msoRequest.requestId", requestId) + .queryParam("msoRequest.serviceInstanceId", serviceInstanceId); + return builder.build().toString(); + } + + protected UriBuilder getUri(String path) { + return UriBuilder.fromPath(path); + } + + protected RestClient getAdapterRestClient(String path) { + return new AdapterRestClient(props, this.getUri(path).build(), MediaType.APPLICATION_JSON, + MediaType.APPLICATION_JSON); + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/VnfVolumeAdapterRestProperties.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/VnfVolumeAdapterRestProperties.java new file mode 100644 index 0000000000..80d064249b --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/VnfVolumeAdapterRestProperties.java @@ -0,0 +1,57 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.adapter.vnf; + +import java.net.MalformedURLException; +import java.net.URL; + +import org.onap.so.bpmn.core.UrnPropertiesReader; +import org.onap.so.client.adapter.rest.AdapterRestProperties; + + +public class VnfVolumeAdapterRestProperties implements AdapterRestProperties { + + protected static final String authProp = "mso.adapters.po.auth"; + protected static final String keyProp = "mso.msoKey"; + protected static final String endpointProp = "mso.adapters.volume-groups.rest.endpoint"; + + public VnfVolumeAdapterRestProperties() { + } + + @Override + public String getAuth() { + return UrnPropertiesReader.getVariable(authProp); + } + @Override + public String getKey() { + return UrnPropertiesReader.getVariable(keyProp); + } + @Override + public URL getEndpoint() throws MalformedURLException { + return new URL(UrnPropertiesReader.getVariable(endpointProp)); + } + + @Override + public String getSystemName() { + return "MSO"; + } + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterObjectMapper.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterObjectMapper.java new file mode 100644 index 0000000000..7e08d8c799 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterObjectMapper.java @@ -0,0 +1,167 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.adapter.vnf.mapper; + + +import org.onap.sdnc.apps.client.model.GenericResourceApiParamParam; +import org.onap.sdnc.apps.client.model.GenericResourceApiVfmoduletopologyVfModuleTopology; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import org.onap.sdnc.apps.client.model.GenericResourceApiParam; +import org.onap.so.adapters.vnfrest.CreateVolumeGroupRequest; +import org.onap.so.adapters.vnfrest.DeleteVolumeGroupRequest; +import org.onap.so.bpmn.core.UrnPropertiesReader; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup; +import org.onap.so.bpmn.servicedecomposition.generalobjects.OrchestrationContext; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.entity.MsoRequest; +import org.springframework.stereotype.Component; +import org.springframework.web.util.UriUtils; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +@Component +public class VnfAdapterObjectMapper { + private ObjectMapper mapper = new ObjectMapper(); + + public CreateVolumeGroupRequest createVolumeGroupRequestMapper(RequestContext requestContext, CloudRegion cloudRegion, OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, GenericVnf genericVnf, VolumeGroup volumeGroup, String sdncVfModuleQueryResponse) throws JsonParseException, JsonMappingException, IOException { + CreateVolumeGroupRequest createVolumeGroupRequest = new CreateVolumeGroupRequest(); + + createVolumeGroupRequest.setCloudSiteId(cloudRegion.getLcpCloudRegionId()); + createVolumeGroupRequest.setTenantId(cloudRegion.getTenantId()); + createVolumeGroupRequest.setVolumeGroupId(volumeGroup.getVolumeGroupId()); + createVolumeGroupRequest.setVolumeGroupName(volumeGroup.getVolumeGroupName()); + createVolumeGroupRequest.setVnfType(genericVnf.getVnfType()); + createVolumeGroupRequest.setVnfVersion(serviceInstance.getModelInfoServiceInstance().getModelVersion()); + createVolumeGroupRequest.setVfModuleType(volumeGroup.getModelInfoVfModule().getModelName()); + createVolumeGroupRequest.setModelCustomizationUuid(volumeGroup.getModelInfoVfModule().getModelCustomizationUUID()); + createVolumeGroupRequest.setVolumeGroupParams(createVolumeGroupParams(requestContext,genericVnf, volumeGroup, sdncVfModuleQueryResponse)); + + createVolumeGroupRequest.setSkipAAI(true); + createVolumeGroupRequest.setSuppressBackout(orchestrationContext.getIsRollbackEnabled()); + createVolumeGroupRequest.setFailIfExists(true); + + createVolumeGroupRequest.setMsoRequest(createMsoRequest(requestContext, serviceInstance)); + + String messageId = getRandomUuid(); + createVolumeGroupRequest.setMessageId(messageId); + createVolumeGroupRequest.setNotificationUrl(createCallbackUrl("VNFAResponse", messageId)); + + return createVolumeGroupRequest; + } + + public DeleteVolumeGroupRequest deleteVolumeGroupRequestMapper(RequestContext requestContext, CloudRegion cloudRegion, ServiceInstance serviceInstance, VolumeGroup volumeGroup) throws IOException { + DeleteVolumeGroupRequest deleteVolumeGroupRequest = new DeleteVolumeGroupRequest(); + + deleteVolumeGroupRequest.setCloudSiteId(cloudRegion.getLcpCloudRegionId()); + deleteVolumeGroupRequest.setTenantId(cloudRegion.getTenantId()); + deleteVolumeGroupRequest.setVolumeGroupId(volumeGroup.getVolumeGroupId()); + deleteVolumeGroupRequest.setVolumeGroupStackId(volumeGroup.getHeatStackId()); + + deleteVolumeGroupRequest.setSkipAAI(true); + deleteVolumeGroupRequest.setMsoRequest(createMsoRequest(requestContext, serviceInstance)); + + String messageId = getRandomUuid(); + deleteVolumeGroupRequest.setMessageId(messageId); + deleteVolumeGroupRequest.setNotificationUrl(createCallbackUrl("VNFAResponse", messageId)); + + return deleteVolumeGroupRequest; + } + + public Map<String, String> createVolumeGroupParams(RequestContext requestContext,GenericVnf genericVnf, VolumeGroup volumeGroup, String sdncVfModuleQueryResponse) throws JsonParseException, JsonMappingException, IOException { + Map<String, String> volumeGroupParams = new HashMap<>(); + final String USER_PARAM_NAME_KEY = "name"; + final String USER_PARAM_VALUE_KEY = "value"; + // sdncVfModuleQueryResponse will not be available in aLaCarte case + if (sdncVfModuleQueryResponse != null) { + GenericResourceApiVfmoduletopologyVfModuleTopology vfModuleTopology = mapper.readValue(sdncVfModuleQueryResponse, GenericResourceApiVfmoduletopologyVfModuleTopology.class); + buildParamsMapFromSdncParams(volumeGroupParams, vfModuleTopology.getVfModuleParameters()); + } + + if(null != requestContext.getRequestParameters() && null != requestContext.getRequestParameters().getUserParams()) { + List<Map<String, Object>> userParams = requestContext.getRequestParameters().getUserParams(); + for (Map<String, Object> userParamsMap : userParams) { + if ( userParamsMap.containsKey(USER_PARAM_NAME_KEY) && (userParamsMap.get(USER_PARAM_NAME_KEY) instanceof String) + && userParamsMap.containsKey(USER_PARAM_VALUE_KEY) && (userParamsMap.get(USER_PARAM_VALUE_KEY) instanceof String)) { + volumeGroupParams.put((String) userParamsMap.get(USER_PARAM_NAME_KEY), (String) userParamsMap.get(USER_PARAM_VALUE_KEY)); + } + } + } + volumeGroupParams.put("vnf_id", genericVnf.getVnfId()); + volumeGroupParams.put("vnf_name", genericVnf.getVnfName()); + volumeGroupParams.put("vf_module_id", volumeGroup.getVolumeGroupId()); + volumeGroupParams.put("vf_module_name", volumeGroup.getVolumeGroupName()); + + return volumeGroupParams; + } + + public MsoRequest createMsoRequest(RequestContext requestContext, ServiceInstance serviceInstance) { + MsoRequest msoRequest = new MsoRequest(); + + msoRequest.setRequestId(requestContext.getMsoRequestId()); + msoRequest.setServiceInstanceId(serviceInstance.getServiceInstanceId()); + + return msoRequest; + } + + private void buildParamsMapFromSdncParams(Map<String,String> volumeGroupParams, GenericResourceApiParam sdncParameters) { + if (sdncParameters != null) { + List<GenericResourceApiParamParam> sdncParametersList = sdncParameters.getParam(); + if (sdncParametersList != null) { + for (int i = 0; i < sdncParametersList.size(); i++) { + GenericResourceApiParamParam param = sdncParametersList.get(i); + String parameterName = param.getName(); + String parameterValue = param.getValue(); + volumeGroupParams.put(parameterName, parameterValue); + } + } + } + } + + protected String getRandomUuid() { + return UUID.randomUUID().toString(); + } + + protected String createCallbackUrl(String messageType, String correlator) throws UnsupportedEncodingException { + String endpoint = getProperty("mso.workflow.message.endpoint"); + + while (endpoint.endsWith("/")) { + endpoint = endpoint.substring(0, endpoint.length()-1); + } + + return endpoint + "/" + UriUtils.encodePathSegment(messageType, "UTF-8") + "/" + UriUtils.encodePathSegment(correlator, "UTF-8"); + } + + protected String getProperty(String key) { + return UrnPropertiesReader.getVariable(key); + } + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterObjectMapperUtils.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterObjectMapperUtils.java new file mode 100644 index 0000000000..6b2d64f170 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterObjectMapperUtils.java @@ -0,0 +1,54 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.adapter.vnf.mapper; + +import java.io.UnsupportedEncodingException; +import java.util.UUID; + +import org.onap.so.bpmn.core.UrnPropertiesReader; +import org.springframework.stereotype.Component; +import org.springframework.web.util.UriUtils; + +@Component("VnfAdapterObjectMapperUtils") +public class VnfAdapterObjectMapperUtils { + + public String getRandomUuid() { + return UUID.randomUUID().toString(); + } + + public String createCallbackUrl(String messageType, String correlator) throws UnsupportedEncodingException { + String endpoint = getProperty("mso.workflow.message.endpoint"); + if (endpoint != null) { + while (endpoint.endsWith("/")) { + endpoint = endpoint.substring(0, endpoint.length() - 1); + } + } + + return endpoint + "/" + UriUtils.encodePathSegment(messageType, "UTF-8") + "/" + + UriUtils.encodePathSegment(correlator, "UTF-8"); + } + + protected String getProperty(String key) { + + return UrnPropertiesReader.getVariable(key); + } + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterVfModuleObjectMapper.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterVfModuleObjectMapper.java new file mode 100644 index 0000000000..88bc08826f --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterVfModuleObjectMapper.java @@ -0,0 +1,730 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.adapter.vnf.mapper; + +import static java.util.Arrays.asList; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.onap.so.adapters.vnfrest.CreateVfModuleRequest; +import org.onap.so.adapters.vnfrest.DeleteVfModuleRequest; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule; +import org.onap.so.bpmn.servicedecomposition.generalobjects.OrchestrationContext; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.entity.MsoRequest; +import org.onap.so.jsonpath.JsonPathUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import org.onap.sdnc.apps.client.model.GenericResourceApiParam; +import org.onap.sdnc.apps.client.model.GenericResourceApiParamParam; +import org.onap.sdnc.apps.client.model.GenericResourceApiSubInterfaceNetworkData; +import org.onap.sdnc.apps.client.model.GenericResourceApiSubinterfacenetworkdataSubInterfaceNetworkData; +import org.onap.sdnc.apps.client.model.GenericResourceApiVfmoduleassignmentsVfModuleAssignments; +import org.onap.sdnc.apps.client.model.GenericResourceApiVfmoduleassignmentsVfmoduleassignmentsVms; +import org.onap.sdnc.apps.client.model.GenericResourceApiVfmoduletopologyVfModuleTopology; +import org.onap.sdnc.apps.client.model.GenericResourceApiVmNetworkData; +import org.onap.sdnc.apps.client.model.GenericResourceApiVmTopologyData; +import org.onap.sdnc.apps.client.model.GenericResourceApiVmnetworkdataFloatingIps; +import org.onap.sdnc.apps.client.model.GenericResourceApiVmnetworkdataInterfaceRoutePrefixes; +import org.onap.sdnc.apps.client.model.GenericResourceApiVmnetworkdataNetworkInformationItems; +import org.onap.sdnc.apps.client.model.GenericResourceApiVmnetworkdataNetworkinformationitemsNetworkInformationItem; +import org.onap.sdnc.apps.client.model.GenericResourceApiVmnetworkdataNetworkinformationitemsNetworkinformationitemNetworkIps; +import org.onap.sdnc.apps.client.model.GenericResourceApiVmnetworkdataSriovParameters; +import org.onap.sdnc.apps.client.model.GenericResourceApiVmnetworkdataSriovparametersHeatVlanFilters; +import org.onap.sdnc.apps.client.model.GenericResourceApiVmtopologydataVmNames; +import org.onap.sdnc.apps.client.model.GenericResourceApiVmtopologydataVmNetworks; +import org.onap.sdnc.apps.client.model.GenericResourceApiVmtopologydataVmnamesVnfcNames; +import org.onap.sdnc.apps.client.model.GenericResourceApiVnfNetworkData; +import org.onap.sdnc.apps.client.model.*; + +import org.onap.sdnc.apps.client.model.GenericResourceApiVnfresourceassignmentsVnfResourceAssignments; +import org.onap.sdnc.apps.client.model.GenericResourceApiVnfresourceassignmentsVnfresourceassignmentsAvailabilityZones; +import org.onap.sdnc.apps.client.model.GenericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworks; +import org.onap.sdnc.apps.client.model.GenericResourceApiVnftopologyVnfTopology; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import jersey.repackaged.com.google.common.base.Joiner; + +@Component +public class VnfAdapterVfModuleObjectMapper { + @Autowired + protected VnfAdapterObjectMapperUtils vnfAdapterObjectMapperUtils; + private static List<String> sdncResponseParamsToSkip = asList("vnf_id", "vf_module_id", "vnf_name", "vf_module_name"); + + private ObjectMapper mapper = new ObjectMapper(); + private static final JsonPathUtil jsonPath = JsonPathUtil.getInstance(); + private static final String SUB_INT = "subint"; + private static final String SUBNET_ID = "_subnet_id"; + private static final String V6_SUBNET_ID = "_v6_subnet_id"; + private static final String PORT = "port"; + private static final String SUB_INT_COUNT = "_subintcount"; + private static final String VLAN_IDS = "_vlan_ids"; + private static final String NET_NAMES = "_net_names"; + private static final String NET_IDS = "_net_ids"; + private static final String IP = "_ip"; + private static final String V6_IP = "_v6_ip"; + private static final String FLOATING_IP = "_floating_ip"; + private static final String FLOATING_V6_IP = "_floating_v6_ip"; + private static final String UNDERSCORE = "_"; + + public CreateVfModuleRequest createVfModuleRequestMapper(RequestContext requestContext, CloudRegion cloudRegion, OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, GenericVnf genericVnf, + VfModule vfModule, String sdncVnfQueryResponse, String sdncVfModuleQueryResponse) throws JsonParseException, JsonMappingException, IOException { + CreateVfModuleRequest createVfModuleRequest = new CreateVfModuleRequest(); + + createVfModuleRequest.setCloudSiteId(cloudRegion.getLcpCloudRegionId()); + createVfModuleRequest.setTenantId(cloudRegion.getTenantId()); + createVfModuleRequest.setVfModuleId(vfModule.getVfModuleId()); + createVfModuleRequest.setVfModuleName(vfModule.getVfModuleName()); + createVfModuleRequest.setVnfType(genericVnf.getVnfType()); + createVfModuleRequest.setVnfVersion(serviceInstance.getModelInfoServiceInstance().getModelVersion()); + createVfModuleRequest.setVfModuleType(vfModule.getModelInfoVfModule().getModelName()); + createVfModuleRequest.setModelCustomizationUuid(vfModule.getModelInfoVfModule().getModelCustomizationUUID()); + + createVfModuleRequest.setVfModuleParams(buildVfModuleParamsMap(requestContext, serviceInstance, genericVnf, vfModule, sdncVnfQueryResponse, sdncVfModuleQueryResponse)); + + createVfModuleRequest.setSkipAAI(true); + createVfModuleRequest.setBackout(orchestrationContext.getIsRollbackEnabled()); + createVfModuleRequest.setFailIfExists(true); + + MsoRequest msoRequest = buildMsoRequest(requestContext, serviceInstance); + createVfModuleRequest.setMsoRequest(msoRequest); + + String messageId = vnfAdapterObjectMapperUtils.getRandomUuid(); + createVfModuleRequest.setMessageId(messageId); + createVfModuleRequest.setNotificationUrl(vnfAdapterObjectMapperUtils.createCallbackUrl("VNFAResponse", messageId)); + + return createVfModuleRequest; + } + + private MsoRequest buildMsoRequest(RequestContext requestContext,ServiceInstance serviceInstance) { + MsoRequest msoRequest = new MsoRequest(); + msoRequest.setRequestId(requestContext.getMsoRequestId()); + msoRequest.setServiceInstanceId(serviceInstance.getServiceInstanceId()); + return msoRequest; + } + + private Map<String,String> buildVfModuleParamsMap(RequestContext requestContext, ServiceInstance serviceInstance, GenericVnf genericVnf, + VfModule vfModule, String sdncVnfQueryResponse, String sdncVfModuleQueryResponse) throws JsonParseException, JsonMappingException, IOException { + GenericResourceApiVnftopologyVnfTopology vnfTopology = mapper.readValue(sdncVnfQueryResponse, GenericResourceApiVnftopologyVnfTopology.class); + GenericResourceApiVfmoduletopologyVfModuleTopology vfModuleTopology = mapper.readValue(sdncVfModuleQueryResponse, GenericResourceApiVfmoduletopologyVfModuleTopology.class); + Map<String,String> paramsMap = new HashMap<>(); + + if(vnfTopology.getSdncGeneratedCloudResources() && vfModuleTopology.getSdncGeneratedCloudResources()) { + buildParamsMapFromVfModuleSdncResponse(paramsMap, vfModuleTopology, true); + buildParamsMapFromVnfSdncResponse(paramsMap, vnfTopology, null, true); + } + else { + Map<String,String> networkRoleMap = buildNetworkRoleMap(vfModuleTopology); + buildParamsMapFromVfModuleSdncResponse(paramsMap, vfModuleTopology, false); + buildParamsMapFromVnfSdncResponse(paramsMap, vnfTopology, networkRoleMap, false); + } + + buildMandatoryParamsMap(paramsMap, serviceInstance, genericVnf, vfModule); + + // Parameters received from the request should overwrite any parameters received from SDNC + paramsMap.putAll(requestContext.getUserParams()); + return paramsMap; + } + + private void buildMandatoryParamsMap(Map<String,String> paramsMap, ServiceInstance serviceInstance, GenericVnf genericVnf, VfModule vfModule) { + paramsMap.put("vnf_id", genericVnf.getVnfId()); + paramsMap.put("vnf_name", genericVnf.getVnfName()); + paramsMap.put("vf_module_id", vfModule.getVfModuleId()); + paramsMap.put("vf_module_name", vfModule.getVfModuleName()); + paramsMap.put("environment_context",serviceInstance.getModelInfoServiceInstance().getEnvironmentContext()); + paramsMap.put("workload_context", serviceInstance.getModelInfoServiceInstance().getWorkloadContext()); + Integer vfModuleIndex = vfModule.getModuleIndex(); + if (vfModuleIndex != null) { + paramsMap.put("vf_module_index", vfModuleIndex.toString()); + } + } + + private void buildParamsMapFromVnfSdncResponse(Map<String,String> paramsMap, GenericResourceApiVnftopologyVnfTopology vnfTopology, Map<String,String> networkRoleMap, boolean skipVnfResourceAssignments) throws JsonParseException, JsonMappingException, IOException { + // Get VNF parameters from SDNC response + GenericResourceApiParam vnfParametersData = vnfTopology.getVnfParametersData(); + buildParamsMapFromSdncParams(paramsMap, vnfParametersData); + + if(!skipVnfResourceAssignments) { + GenericResourceApiVnfresourceassignmentsVnfResourceAssignments vnfResourceAssignments = vnfTopology.getVnfResourceAssignments(); + if (vnfResourceAssignments != null) { + // Availability Zones + buildAvailabilityZones(paramsMap, vnfResourceAssignments); + // VNF Networks + buildVnfNetworks(paramsMap, vnfResourceAssignments, networkRoleMap); + } + } + } + + private void buildAvailabilityZones (Map<String,String> paramsMap, GenericResourceApiVnfresourceassignmentsVnfResourceAssignments vnfResourceAssignments) { + GenericResourceApiVnfresourceassignmentsVnfresourceassignmentsAvailabilityZones availabilityZones = vnfResourceAssignments.getAvailabilityZones(); + if (availabilityZones != null) { + List<String> availabilityZonesList = availabilityZones.getAvailabilityZone(); + if (availabilityZonesList != null) { + for(int i = 0; i < availabilityZonesList.size(); i++) { + paramsMap.put("availability_zone_" + i, availabilityZonesList.get(i)); + } + } + } + } + + private void buildVnfNetworks (Map<String,String> paramsMap, GenericResourceApiVnfresourceassignmentsVnfResourceAssignments vnfResourceAssignments, Map<String,String> networkRoleMap) { + GenericResourceApiVnfresourceassignmentsVnfresourceassignmentsVnfNetworks vnfNetworks = vnfResourceAssignments.getVnfNetworks(); + if (vnfNetworks != null) { + List<GenericResourceApiVnfNetworkData> vnfNetworksList = vnfNetworks.getVnfNetwork(); + if (vnfNetworksList != null) { + for (int i = 0; i < vnfNetworksList.size(); i++) { + GenericResourceApiVnfNetworkData vnfNetwork = vnfNetworksList.get(i); + String networkRole = vnfNetwork.getNetworkRole(); + String vnfNetworkKey = networkRoleMap.get(networkRole); + if (vnfNetworkKey == null || vnfNetworkKey.isEmpty()) { + vnfNetworkKey = networkRole; + } + + String vnfNetworkNeutronIdValue = vnfNetwork.getNeutronId(); + paramsMap.put(vnfNetworkKey + "_net_id", vnfNetworkNeutronIdValue); + String vnfNetworkNetNameValue = vnfNetwork.getNetworkName(); + paramsMap.put(vnfNetworkKey + "_net_name", vnfNetworkNetNameValue); + String vnfNetworkNetFqdnValue = vnfNetwork.getContrailNetworkFqdn(); + paramsMap.put(vnfNetworkKey + "_net_fqdn", vnfNetworkNetFqdnValue); + + buildVnfNetworkSubnets(paramsMap, vnfNetwork, vnfNetworkKey); + + } + } + } + } + + private void buildVnfNetworkSubnets(Map<String,String> paramsMap, GenericResourceApiVnfNetworkData vnfNetwork, String vnfNetworkKey) { + String vnfNetworkString = convertToString(vnfNetwork); + Optional<String> ipv4Ips = jsonPath.locateResult(vnfNetworkString, "$.subnets-data.subnet-data[*].[?(@.ip-version == 'ipv4' && @.dhcp-enabled == 'Y')].subnet-id"); + if(ipv4Ips.isPresent()) + addPairToMap(paramsMap, vnfNetworkKey, SUBNET_ID, ipv4Ips.get()); + + Optional<String> ipv6Ips = jsonPath.locateResult(vnfNetworkString, "$.subnets-data.subnet-data[*].[?(@.ip-version == 'ipv6' && @.dhcp-enabled == 'Y')].subnet-id"); + if(ipv6Ips.isPresent()) + addPairToMap(paramsMap, vnfNetworkKey, V6_SUBNET_ID, ipv6Ips.get()); + } + + private void buildParamsMapFromVfModuleSdncResponse(Map<String,String> paramsMap, GenericResourceApiVfmoduletopologyVfModuleTopology vfModuleTopology, boolean skipVfModuleAssignments) throws JsonParseException, JsonMappingException, IOException { + // Get VF Module parameters from SDNC response + GenericResourceApiParam vfModuleParametersData = vfModuleTopology.getVfModuleParameters(); + buildParamsMapFromSdncParams(paramsMap, vfModuleParametersData); + + if(!skipVfModuleAssignments) { + GenericResourceApiVfmoduleassignmentsVfModuleAssignments vfModuleAssignments = vfModuleTopology.getVfModuleAssignments(); + if (vfModuleAssignments != null) { + // VNF-VMS + GenericResourceApiVfmoduleassignmentsVfmoduleassignmentsVms vms = vfModuleAssignments.getVms(); + if (vms != null) { + List<GenericResourceApiVmTopologyData> vmsList = vms.getVm(); + if (vmsList != null) { + for (GenericResourceApiVmTopologyData vm : vmsList){ + String key = vm.getVmType(); + buildVfModuleVmNames(paramsMap, vm, key); + GenericResourceApiVmtopologydataVmNetworks vmNetworks = vm.getVmNetworks(); + if (vmNetworks != null) { + List<GenericResourceApiVmNetworkData> vmNetworksList = vmNetworks.getVmNetwork(); + if (vmNetworksList != null) { + for(int n = 0; n < vmNetworksList.size(); n++){ + GenericResourceApiVmNetworkData network = vmNetworksList.get(n); + network.getNetworkRoleTag(); + String networkKey = network.getNetworkRole(); + // Floating IPs + buildVfModuleFloatingIps(paramsMap, network, key, networkKey); + // Interface Route Prefixes + buildVfModuleInterfaceRoutePrefixes(paramsMap, network, key, networkKey); + // SRIOV Parameters + buildVfModuleSriovParameters(paramsMap, network, networkKey); + // IPV4 and IPV6 Addresses + buildVfModuleNetworkInformation(paramsMap, network, key, networkKey); + } + } + } + + buildParamsMapFromVfModuleForHeatTemplate(paramsMap, vm); + } + } + } + } + } + } + + private void buildVfModuleVmNames(Map<String,String> paramsMap, GenericResourceApiVmTopologyData vm, String key) { + String values = ""; + GenericResourceApiVmtopologydataVmNames vmNames = vm.getVmNames(); + if (vmNames != null) { + List<String> valueList = vmNames.getVmName(); + if (valueList != null) { + for(int i = 0; i < valueList.size(); i++){ + String value = valueList.get(i); + if (i != valueList.size() - 1) { + values += value + ","; + } + else { + values += value; + } + paramsMap.put(key + "_name_" + i, value); + } + paramsMap.put(key + "_names", values); + } + } + } + + private void buildVfModuleFloatingIps(Map<String,String> paramsMap, GenericResourceApiVmNetworkData network, String key, String networkKey) { + GenericResourceApiVmnetworkdataFloatingIps floatingIps = network.getFloatingIps(); + if (floatingIps != null) { + List<String> floatingIpV4List = floatingIps.getFloatingIpV4(); + if (floatingIpV4List != null) { + // add only one ipv4 floating ip for now + String floatingIPKey = key + UNDERSCORE + networkKey + FLOATING_IP; + String floatingIPKeyValue = floatingIpV4List.get(0); + if (floatingIPKeyValue != null && !floatingIPKeyValue.isEmpty()) { + paramsMap.put(floatingIPKey, floatingIPKeyValue); + } + } + // add only one ipv6 floating ip for now + List<String> floatingIpV6List = floatingIps.getFloatingIpV6(); + if (floatingIpV6List != null) { + String floatingIPV6Key = key + UNDERSCORE + networkKey + FLOATING_V6_IP; + String floatingIPV6KeyValue = floatingIpV6List.get(0); + if (floatingIPV6KeyValue != null && !floatingIPV6KeyValue.isEmpty()) { + paramsMap.put(floatingIPV6Key, floatingIPV6KeyValue); + } + } + } + } + + private void buildVfModuleInterfaceRoutePrefixes(Map<String,String> paramsMap, GenericResourceApiVmNetworkData network, String key, String networkKey) { + GenericResourceApiVmnetworkdataInterfaceRoutePrefixes interfaceRoutePrefixes = network.getInterfaceRoutePrefixes(); + if (interfaceRoutePrefixes != null) { + List<String> interfaceRoutePrefixesList = interfaceRoutePrefixes.getInterfaceRoutePrefix(); + StringBuilder sbInterfaceRoutePrefixes = new StringBuilder(); + sbInterfaceRoutePrefixes.append("["); + if (interfaceRoutePrefixesList != null) { + for(int a = 0; a < interfaceRoutePrefixesList.size(); a++){ + String interfaceRoutePrefixValue = interfaceRoutePrefixesList.get(a); + if (a != interfaceRoutePrefixesList.size() - 1) { + sbInterfaceRoutePrefixes.append("{\"interface_route_table_routes_route_prefix\": \"" + interfaceRoutePrefixValue + "\"}" + ","); + } + else { + sbInterfaceRoutePrefixes.append("{\"interface_route_table_routes_route_prefix\": \"" + interfaceRoutePrefixValue + "\"}"); + } + } + sbInterfaceRoutePrefixes.append("]"); + if (interfaceRoutePrefixesList.size() > 0) { + paramsMap.put(key + UNDERSCORE + networkKey + "_route_prefixes", sbInterfaceRoutePrefixes.toString()); + } + } + } + } + + private void buildVfModuleSriovParameters(Map<String,String> paramsMap, GenericResourceApiVmNetworkData network, String networkKey) { + // SRIOV Parameters + GenericResourceApiVmnetworkdataSriovParameters sriovParameters = network.getSriovParameters(); + if (sriovParameters != null) { + GenericResourceApiVmnetworkdataSriovparametersHeatVlanFilters heatVlanFilters = sriovParameters.getHeatVlanFilters(); + if (heatVlanFilters != null) { + List<String> heatVlanFiltersList = heatVlanFilters.getHeatVlanFilter(); + StringBuilder sriovFilterBuf = new StringBuilder(); + if (heatVlanFiltersList != null) { + for(int a = 0; a < heatVlanFiltersList.size(); a++){ + String heatVlanFilterValue = heatVlanFiltersList.get(a); + if (a != heatVlanFiltersList.size() - 1) { + sriovFilterBuf.append(heatVlanFilterValue).append(","); + } + else { + sriovFilterBuf.append(heatVlanFilterValue); + } + } + if (heatVlanFiltersList.size() > 0) { + paramsMap.put(networkKey + "_ATT_VF_VLAN_FILTER", sriovFilterBuf.toString()); + } + } + } + } + } + + private void buildVfModuleNetworkInformation(Map<String,String> paramsMap, GenericResourceApiVmNetworkData network, String key, String networkKey) { + + GenericResourceApiVmnetworkdataNetworkInformationItems networkInformationItems = network.getNetworkInformationItems(); + StringBuilder sbIpv4Ips = new StringBuilder(); + StringBuilder sbIpv6Ips = new StringBuilder(); + + if (networkInformationItems != null) { + List<GenericResourceApiVmnetworkdataNetworkinformationitemsNetworkInformationItem> networkInformationItemList = networkInformationItems.getNetworkInformationItem(); + if (networkInformationItemList != null) { + for(int a = 0; a < networkInformationItemList.size(); a++){ + GenericResourceApiVmnetworkdataNetworkinformationitemsNetworkInformationItem ipAddress = networkInformationItemList.get(a); + if (ipAddress != null) { + GenericResourceApiVmnetworkdataNetworkinformationitemsNetworkinformationitemNetworkIps ips = ipAddress.getNetworkIps(); + if (ips != null) { + List<String> ipsList = ips.getNetworkIp(); + if (ipsList != null) { + String ipVersion = ipAddress.getIpVersion(); + for (int b = 0; b < ipsList.size(); b++) { + String ipAddressValue = ipsList.get(b); + if (ipVersion.equals("ipv4")) { + if (b != ipsList.size() - 1) { + sbIpv4Ips.append(ipAddressValue + ","); + } + else { + sbIpv4Ips.append(ipAddressValue); + } + paramsMap.put(key + UNDERSCORE + networkKey + IP + UNDERSCORE + b, ipAddressValue); + } + else if (ipVersion.equals("ipv6")) { + if (b != ipsList.size() - 1) { + sbIpv6Ips.append(ipAddressValue + ","); + } + else { + sbIpv6Ips.append(ipAddressValue); + } + paramsMap.put(key + UNDERSCORE + networkKey + V6_IP + UNDERSCORE + b, ipAddressValue); + } + } + paramsMap.put(key + UNDERSCORE + networkKey + "_ips", sbIpv4Ips.toString()); + paramsMap.put(key + UNDERSCORE + networkKey + "_v6_ips", sbIpv6Ips.toString()); + } + } + } + } + } + } + } + + /* + * Build Mapping from GenericResourceApi SDNC for Heat Template so that AIC - PO gets accurate requests for vf module assignments. + * Build Count of SubInterfaces, VLAN Tag, network_name, network_id, + * ip_address (V4 and V6) and Floating IPs Addresses (V4 and V6) for Heat Template + */ + private void buildParamsMapFromVfModuleForHeatTemplate(Map<String,String> paramsMap, GenericResourceApiVmTopologyData vm) { + GenericResourceApiVmtopologydataVmNames vmNames = vm.getVmNames(); + + if (vmNames != null) { + + List<GenericResourceApiVmtopologydataVmnamesVnfcNames> vnfcNamesList = vmNames.getVnfcNames(); + if (vnfcNamesList != null) { + + for(int i = 0; i < vnfcNamesList.size(); i++){ + + GenericResourceApiVmtopologydataVmnamesVnfcNames vnfcNames = vnfcNamesList.get(i); + parseVnfcNamesData(paramsMap, vnfcNames); + } + } + } + } + + /* + * Parse vnfcNames data to build Mapping from GenericResourceApi SDNC for Heat Template. + */ + private void parseVnfcNamesData(Map<String,String> paramsMap, GenericResourceApiVmtopologydataVmnamesVnfcNames vnfcNames) { + + if (vnfcNames != null) { + GenericResourceApiVnfcNetworkData vnfcNetworks = vnfcNames.getVnfcNetworks(); + if (vnfcNetworks != null) { + List<GenericResourceApiVnfcnetworkdataVnfcNetworkData> vnfcNetworkdataList = vnfcNetworks.getVnfcNetworkData(); + + if (vnfcNetworkdataList != null) { + + for(int networkDataIdx = 0; networkDataIdx < vnfcNetworkdataList.size(); networkDataIdx++){ + + GenericResourceApiVnfcnetworkdataVnfcNetworkData vnfcNetworkdata = vnfcNetworkdataList.get(networkDataIdx); + parseVnfcNetworkData(paramsMap, vnfcNetworkdata, networkDataIdx); + } + } + } + } + } + + /* + * Parse VnfcNetworkData to build Mapping from GenericResourceApi SDNC for Heat Template. + * Build Count of SubInterfaces, VLAN Tag, network_name, network_id, + * ip_address (V4 and V6) and Floating IPs Addresses (V4 and V6) for Heat Template + */ + private void parseVnfcNetworkData(Map<String,String> paramsMap, GenericResourceApiVnfcnetworkdataVnfcNetworkData vnfcNetworkdata, int networkDataIdx) { + + String vmTypeKey = vnfcNetworkdata.getVnfcType(); + GenericResourceApiVnfcnetworkdataVnfcnetworkdataVnfcPorts vnfcPorts = vnfcNetworkdata.getVnfcPorts(); + List<GenericResourceApiVnfcnetworkdataVnfcnetworkdataVnfcportsVnfcPort> vnfcPortList = vnfcPorts.getVnfcPort(); + if (vnfcPortList != null) { + for(int portIdx = 0; portIdx < vnfcPortList.size(); portIdx++){ + + GenericResourceApiVnfcnetworkdataVnfcnetworkdataVnfcportsVnfcPort vnfcPort = vnfcPortList.get(portIdx); + GenericResourceApiSubInterfaceNetworkData vnicSubInterfaces = vnfcPort.getVnicSubInterfaces(); + + String vnicSubInterfacesString = convertToString(vnicSubInterfaces); + String networkRoleKey = vnfcPort.getCommonSubInterfaceRole(); + String subInterfaceKey = createVnfcSubInterfaceKey(vmTypeKey, networkDataIdx, networkRoleKey, portIdx); + String globalSubInterfaceKey = createGlobalVnfcSubInterfaceKey(vmTypeKey, networkRoleKey, portIdx); + + buildVfModuleSubInterfacesCount(paramsMap, globalSubInterfaceKey, vnicSubInterfaces); + + buildVfModuleVlanTag(paramsMap, subInterfaceKey, vnicSubInterfacesString); + + buildVfModuleNetworkName(paramsMap, subInterfaceKey, vnicSubInterfacesString); + + buildVfModuleNetworkId(paramsMap, subInterfaceKey, vnicSubInterfacesString); + + buildVfModuleIpV4AddressHeatTemplate(paramsMap, subInterfaceKey, vnicSubInterfacesString); + + buildVfModuleIpV6AddressHeatTemplate(paramsMap, subInterfaceKey, vnicSubInterfacesString); + + buildVfModuleFloatingIpV4HeatTemplate(paramsMap, globalSubInterfaceKey, vnicSubInterfacesString); + + buildVfModuleFloatingIpV6HeatTemplate(paramsMap, globalSubInterfaceKey, vnicSubInterfacesString); + } + } + } + + /* + * Build "count" (calculating the total number of sub-interfaces) for Heat Template + * Building Criteria : {vm-type}_subint_{network-role}_port_{index}_subintcount + * vmTypeKey = vm-type, networkRoleKey = common-sub-interface-role + * Example: fw_subint_ctrl_port_0_subintcount + * + */ + private void buildVfModuleSubInterfacesCount(Map<String,String> paramsMap, String keyPrefix, GenericResourceApiSubInterfaceNetworkData vnicSubInterfaces) { + + List<GenericResourceApiSubinterfacenetworkdataSubInterfaceNetworkData> subInterfaceNetworkDataList = vnicSubInterfaces.getSubInterfaceNetworkData(); + + if ( (subInterfaceNetworkDataList != null) && !subInterfaceNetworkDataList.isEmpty() ) { + addPairToMap(paramsMap, keyPrefix, SUB_INT_COUNT, String.valueOf(subInterfaceNetworkDataList.size())); + } + } + + protected String createVnfcSubInterfaceKey(String vmTypeKey, int networkDataIdx, String networkRoleKey, int portIdx) { + + return Joiner.on(UNDERSCORE).join(Arrays.asList(vmTypeKey, networkDataIdx, SUB_INT, networkRoleKey, PORT, portIdx)); + } + + protected String createGlobalVnfcSubInterfaceKey(String vmTypeKey,String networkRoleKey, int portIdx) { + + return Joiner.on(UNDERSCORE).join(Arrays.asList(vmTypeKey, SUB_INT, networkRoleKey, PORT, portIdx)); + } + + /* + * Build VLAN Tag for Heat Template + * Building Criteria : {vm-type}_{index}_subint_{network-role}_port_{index}_vlan_ids + * vmTypeKey = vm-type, networkRoleKey = common-sub-interface-role + * Example: fw_0_subint_ctrl_port_0_vlan_ids + * + */ + protected void buildVfModuleVlanTag(Map<String,String> paramsMap, String keyPrefix, String vnicSubInterfaces) { + + List<String> vlanTagIds = jsonPath.locateResultList(vnicSubInterfaces, "$.sub-interface-network-data[*].vlan-tag-id"); + + addPairToMap(paramsMap, keyPrefix, VLAN_IDS, vlanTagIds); + } + /* + * Build "network_name" for Heat Template + * Building Criteria : {vm-type}_{index}_subint_{network-role}_port_{index}_net_names + * vmTypeKey = vm-type, networkRoleKey = common-sub-interface-role + * Example: fw_0_subint_ctrl_port_0_net_names + * + */ + protected void buildVfModuleNetworkName(Map<String,String> paramsMap, String keyPrefix, String vnicSubInterfaces) { + + List<String> neworkNames = jsonPath.locateResultList(vnicSubInterfaces, "$.sub-interface-network-data[*].network-name"); + + addPairToMap(paramsMap, keyPrefix, NET_NAMES, neworkNames); + } + + /* + * Build "network_id" for Heat Template + * Building Criteria : {vm-type}_{index}_subint_{network-role}_port_{index}_net_ids + * vmTypeKey = vm-type, networkRoleKey = common-sub-interface-role + * Example: fw_0_subint_ctrl_port_0_net_ids + * + */ + protected void buildVfModuleNetworkId(Map<String,String> paramsMap, String keyPrefix, String vnicSubInterfaces) { + + List<String> neworkIds = jsonPath.locateResultList(vnicSubInterfaces, "$.sub-interface-network-data[*].network-id"); + + addPairToMap(paramsMap, keyPrefix, NET_IDS, neworkIds); + } + + /* + * Build ip_address for V4 for Heat Template + * Building Criteria : + * {vm-type}_{index}_subint_{network-role}_port_{index}_ip_{index} -- for ipV4 + * key = vm-type, networkRoleKey = NetWork-Role + */ + protected void buildVfModuleIpV4AddressHeatTemplate(Map<String,String> paramsMap, String keyPrefix, String vnicSubInterfaces) { + + List<String> ipv4Ips = jsonPath.locateResultList(vnicSubInterfaces, "$.sub-interface-network-data[*].network-information-items.network-information-item[?(@.ip-version == 'ipv4')].network-ips.network-ip[*]"); + + addPairToMap(paramsMap, keyPrefix, IP, ipv4Ips); + + for (int i = 0; i < ipv4Ips.size(); i++) { + addPairToMap(paramsMap, keyPrefix, IP + UNDERSCORE + i, ipv4Ips.get(i)); + } + + } + + /* + * Build ip_address for Heat Template + * Building Criteria : + * {vm-type}_{index}_subint_{network-role}_port_{index}_v6_ip_{index} -- for ipV6 + * key = vm-type, networkRoleKey = NetWork-Role + */ + protected void buildVfModuleIpV6AddressHeatTemplate(Map<String,String> paramsMap, String keyPrefix, String vnicSubInterfaces) { + + List<String> ipv6Ips = jsonPath.locateResultList(vnicSubInterfaces, "$.sub-interface-network-data[*].network-information-items.network-information-item[?(@.ip-version == 'ipv6')].network-ips.network-ip[*]"); + + addPairToMap(paramsMap, keyPrefix, V6_IP, ipv6Ips); + + for (int i = 0; i < ipv6Ips.size(); i++) { + addPairToMap(paramsMap, keyPrefix, V6_IP + UNDERSCORE + i, ipv6Ips.get(i)); + } + } + + /* + * Build floatingip_address for Heat Template + * Building Criteria : + * {vm-type}_subint_{network-role}_port_{index}_floating_ip -- for ipV4 + */ + protected void buildVfModuleFloatingIpV4HeatTemplate(Map<String,String> paramsMap, String keyPrefix, String vnicSubInterfaces) { + + List<String> floatingV4 = jsonPath.locateResultList(vnicSubInterfaces, "$.sub-interface-network-data[*].floating-ips.floating-ip-v4[*]"); + + if (!floatingV4.isEmpty()) { + floatingV4 = Collections.singletonList(floatingV4.get(0)); + } + addPairToMap(paramsMap, keyPrefix, FLOATING_IP, floatingV4); + + } + + /* + * Build floatingip_address for Heat Template + * Building Criteria : + * {vm-type}_subint_{network-role}_port_{index}_floating_v6_ip -- for ipV6 + */ + protected void buildVfModuleFloatingIpV6HeatTemplate(Map<String,String> paramsMap, String keyPrefix, String vnicSubInterfaces) { + + List<String> floatingV6 = jsonPath.locateResultList(vnicSubInterfaces, "$.sub-interface-network-data[*].floating-ips.floating-ip-v6[*]"); + + if (!floatingV6.isEmpty()) { + floatingV6 = Collections.singletonList(floatingV6.get(0)); + } + addPairToMap(paramsMap, keyPrefix, FLOATING_V6_IP, floatingV6); + } + + protected void addPairToMap(Map<String, String> paramsMap, String keyPrefix, String key, String value) { + + addPairToMap(paramsMap, keyPrefix, key, Collections.singletonList(value)); + } + + protected void addPairToMap(Map<String, String> paramsMap, String keyPrefix, String key, List<String> value) { + + if (!value.isEmpty()) { + paramsMap.put(keyPrefix + key, Joiner.on(",").join(value)); + } + } + + private void buildParamsMapFromSdncParams(Map<String,String> paramsMap, GenericResourceApiParam parametersData) { + if (parametersData != null) { + List<GenericResourceApiParamParam> paramsList = parametersData.getParam(); + if (paramsList != null) { + for (int i = 0; i < paramsList.size(); i++) { + GenericResourceApiParamParam param = paramsList.get(i); + String parameterName = param.getName(); + if (!sdncResponseParamsToSkip.contains(parameterName)) { + String parameterValue = param.getValue(); + paramsMap.put(parameterName, parameterValue); + } + } + } + } + } + + private Map<String,String> buildNetworkRoleMap(GenericResourceApiVfmoduletopologyVfModuleTopology vfModuleTopology) throws JsonParseException, JsonMappingException, IOException { + Map<String, String> networkRoleMap = new HashMap<>(); + GenericResourceApiVfmoduleassignmentsVfModuleAssignments vfModuleAssignments = vfModuleTopology.getVfModuleAssignments(); + if (vfModuleAssignments != null) { + GenericResourceApiVfmoduleassignmentsVfmoduleassignmentsVms vms = vfModuleAssignments.getVms(); + if (vms != null) { + List<GenericResourceApiVmTopologyData> vmsList = vms.getVm(); + if (vmsList != null) { + for (GenericResourceApiVmTopologyData vm : vmsList){ + GenericResourceApiVmtopologydataVmNetworks vmNetworks = vm.getVmNetworks(); + if (vmNetworks != null) { + List<GenericResourceApiVmNetworkData> vmNetworksList = vmNetworks.getVmNetwork(); + if (vmNetworksList != null) { + for(int n = 0; n < vmNetworksList.size(); n++){ + GenericResourceApiVmNetworkData network = vmNetworksList.get(n); + String networkRole = network.getNetworkRole(); + String networkRoleValue = network.getNetworkRoleTag(); + if (networkRoleValue == null || networkRoleValue.isEmpty()) { + networkRoleValue = networkRole; + } + networkRoleMap.put(networkRole, networkRoleValue); + } + } + } + } + } + } + } + return networkRoleMap; + } + + public DeleteVfModuleRequest deleteVfModuleRequestMapper(RequestContext requestContext,CloudRegion cloudRegion, + ServiceInstance serviceInstance, GenericVnf genericVnf, + VfModule vfModule) throws IOException { + DeleteVfModuleRequest deleteVfModuleRequest = new DeleteVfModuleRequest(); + deleteVfModuleRequest.setCloudSiteId(cloudRegion.getLcpCloudRegionId()); + deleteVfModuleRequest.setTenantId(cloudRegion.getTenantId()); + deleteVfModuleRequest.setVnfId(genericVnf.getVnfId()); + deleteVfModuleRequest.setVfModuleId(vfModule.getVfModuleId()); + deleteVfModuleRequest.setVfModuleStackId(vfModule.getHeatStackId());//DoDVfMod_heatStackId + deleteVfModuleRequest.setSkipAAI(true); + String messageId = vnfAdapterObjectMapperUtils.getRandomUuid(); + deleteVfModuleRequest.setMessageId(messageId); + deleteVfModuleRequest.setNotificationUrl(vnfAdapterObjectMapperUtils.createCallbackUrl("VNFAResponse", messageId)); + MsoRequest msoRequest = buildMsoRequest(requestContext, serviceInstance); + deleteVfModuleRequest.setMsoRequest(msoRequest); + return deleteVfModuleRequest; + } + + private String convertToString(Object obj) { + String json; + try { + json = mapper.writeValueAsString(obj); + } catch (JsonProcessingException e) { + json = "{}"; + } + + return json; + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAICollectionResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAICollectionResources.java new file mode 100644 index 0000000000..4a9f01fa53 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAICollectionResources.java @@ -0,0 +1,58 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.orchestration; + +import org.onap.so.bpmn.common.InjectionHelper; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Collection; +import org.onap.so.client.aai.AAIObjectType; +import org.onap.so.client.aai.entities.uri.AAIResourceUri; +import org.onap.so.client.aai.entities.uri.AAIUriFactory; +import org.onap.so.client.aai.mapper.AAIObjectMapper; +import org.onap.so.db.catalog.beans.OrchestrationStatus; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class AAICollectionResources { + @Autowired + private InjectionHelper injectionHelper; + + @Autowired + private AAIObjectMapper aaiObjectMapper; + + public void createCollection(Collection collection) { + AAIResourceUri networkCollectionURI = AAIUriFactory.createResourceUri(AAIObjectType.COLLECTION, collection.getId()); + collection.setOrchestrationStatus(OrchestrationStatus.INVENTORIED); + org.onap.aai.domain.yang.Collection aaiCollection = aaiObjectMapper.mapCollection(collection); + injectionHelper.getAaiClient().create(networkCollectionURI, aaiCollection); + } + + public void updateCollection(Collection collection) { + AAIResourceUri networkCollectionURI = AAIUriFactory.createResourceUri(AAIObjectType.COLLECTION, collection.getId()); + org.onap.aai.domain.yang.Collection aaiCollection = aaiObjectMapper.mapCollection(collection); + injectionHelper.getAaiClient().update(networkCollectionURI, aaiCollection); + } + + public void deleteCollection(Collection collection) { + AAIResourceUri instanceGroupUri = AAIUriFactory.createResourceUri(AAIObjectType.COLLECTION, collection.getId()); + injectionHelper.getAaiClient().delete(instanceGroupUri); + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIConfigurationResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIConfigurationResources.java new file mode 100644 index 0000000000..b84f8b6459 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIConfigurationResources.java @@ -0,0 +1,170 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.orchestration; + +import java.util.Optional; + +import javax.ws.rs.core.UriBuilder; + +import org.onap.so.bpmn.common.InjectionHelper; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Configuration; +import org.onap.so.client.aai.AAIObjectType; +import org.onap.so.client.aai.entities.uri.AAIResourceUri; +import org.onap.so.client.aai.entities.uri.AAIUriFactory; +import org.onap.so.client.aai.mapper.AAIObjectMapper; +import org.onap.so.db.catalog.beans.OrchestrationStatus; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class AAIConfigurationResources { + @Autowired + private InjectionHelper injectionHelper; + + @Autowired + private AAIObjectMapper aaiObjectMapper; + + /** + * A&AI call to create configuration + * + * @param configuration + */ + public void createConfiguration(Configuration configuration) { + AAIResourceUri configurationURI = AAIUriFactory.createResourceUri(AAIObjectType.CONFIGURATION, configuration.getConfigurationId()); + configuration.setOrchestrationStatus(OrchestrationStatus.INVENTORIED); + org.onap.aai.domain.yang.Configuration aaiConfiguration = aaiObjectMapper.mapConfiguration(configuration); + injectionHelper.getAaiClient().create(configurationURI, aaiConfiguration); + } + + /** + * method to get Configuration details from A&AI + * + * @param configurationId + * @return + */ + public Optional<org.onap.aai.domain.yang.Configuration> getConfiguration(String configurationId) { + AAIResourceUri aaiResourceUri = AAIUriFactory.createResourceUri(AAIObjectType.CONFIGURATION, configurationId); + return injectionHelper.getAaiClient().get(org.onap.aai.domain.yang.Configuration.class, aaiResourceUri); + } + + /** + * A&AI call to update configuration + * + * @param configuration + */ + public void updateConfiguration(Configuration configuration) { + AAIResourceUri configurationURI = AAIUriFactory.createResourceUri(AAIObjectType.CONFIGURATION, configuration.getConfigurationId()); + org.onap.aai.domain.yang.Configuration aaiConfiguration = aaiObjectMapper.mapConfiguration(configuration); + injectionHelper.getAaiClient().update(configurationURI, aaiConfiguration); + } + /** + * A&AI call to disconnect configuration relation with service instance + * @param configurationId + * @param serviceInstanceId + */ + + public void disconnectConfigurationToServiceInstance(String configurationId, String serviceInstanceId){ + AAIResourceUri configurationURI = AAIUriFactory.createResourceUri(AAIObjectType.CONFIGURATION, configurationId); + AAIResourceUri serviceInstanceURI = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, + serviceInstanceId); + injectionHelper.getAaiClient().disconnect(configurationURI,serviceInstanceURI); + } + + /** + * A&AI call to add vrf configuration relationship with Vnr Configuration + * + * @param vrfConfigurationId + * @param vnrConfigurationId + */ + public void connectVrfConfigurationToVnrConfiguration(String vrfConfigurationId, String vnrConfigurationId) { + AAIResourceUri vnrConfigurationUri = AAIUriFactory.createResourceUri(AAIObjectType.CONFIGURATION, vnrConfigurationId); + AAIResourceUri vrfConfigurationUri = AAIUriFactory.createResourceUri(AAIObjectType.CONFIGURATION, vrfConfigurationId); + injectionHelper.getAaiClient().connect(vrfConfigurationUri, vnrConfigurationUri); + } + + /** + * A&AI call to add configuration relationship with PnfObject + * + * @param pnfId + * @param configurationId + */ + public void connectConfigurationToPnfObject(String pnfId, String configurationId) { + AAIResourceUri pnfUri = AAIUriFactory.createResourceUri(AAIObjectType.PNF, pnfId); + AAIResourceUri configurationUri = AAIUriFactory.createResourceUri(AAIObjectType.CONFIGURATION, configurationId); + injectionHelper.getAaiClient().connect(configurationUri, pnfUri); + } + + /** + * A&AI call to add configuration relationship with service instance + * + * @param configurationId + * @param serviceInstanceId + */ + public void connectConfigurationToServiceInstance(String configurationId, String serviceInstanceId) { + AAIResourceUri configurationURI = AAIUriFactory.createResourceUri(AAIObjectType.CONFIGURATION, configurationId); + AAIResourceUri serviceInstanceURI = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, + serviceInstanceId); + injectionHelper.getAaiClient().connect(configurationURI, serviceInstanceURI); + } + + /** + * A&AI call to add configuration relationship with generic-vnf + * + * @param configurationId + * @param genericVnfId + */ + public void connectConfigurationToGenericVnf(String configurationId, String genericVnfId) { + AAIResourceUri configurationURI = AAIUriFactory.createResourceUri(AAIObjectType.CONFIGURATION, configurationId); + AAIResourceUri genericVnfURI = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, genericVnfId); + injectionHelper.getAaiClient().connect(configurationURI, genericVnfURI); + } + + /** + * A&AI call to add configuration relationship with vpn-binding + * + * @param configurationId + * @param vpnId + */ + public void connectConfigurationToVpnBinding(String configurationId, String vpnId) { + AAIResourceUri configurationURI = AAIUriFactory.createResourceUri(AAIObjectType.CONFIGURATION, configurationId); + AAIResourceUri vpnBindingURI = AAIUriFactory.createResourceUri(AAIObjectType.VPN_BINDING, vpnId); + injectionHelper.getAaiClient().connect(configurationURI, vpnBindingURI); + } + /** + * method to delete Configuration details in A&AI + * + * @param configurationId + */ + public void deleteConfiguration(String configurationId) { + AAIResourceUri aaiResourceUri = AAIUriFactory.createResourceUri(AAIObjectType.CONFIGURATION, configurationId); + injectionHelper.getAaiClient().delete(aaiResourceUri); + } + + /** + * Get Configuration from AAI using related Link + * @param relatedLink related link - URI + * @return AAI Configuration object + */ + public Optional<org.onap.aai.domain.yang.Configuration> getConfigurationFromRelatedLink(String relatedLink){ + return injectionHelper.getAaiClient() + .get(org.onap.aai.domain.yang.Configuration.class, AAIUriFactory.createResourceFromExistingURI(AAIObjectType.CONFIGURATION, UriBuilder.fromPath(relatedLink).build())); + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIInstanceGroupResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIInstanceGroupResources.java new file mode 100644 index 0000000000..4c4edb7fe9 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIInstanceGroupResources.java @@ -0,0 +1,65 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.orchestration; + +import java.util.Optional; + +import org.onap.so.bpmn.common.InjectionHelper; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.InstanceGroup; +import org.onap.so.client.aai.AAIObjectType; +import org.onap.so.client.aai.entities.uri.AAIResourceUri; +import org.onap.so.client.aai.entities.uri.AAIUriFactory; +import org.onap.so.client.aai.mapper.AAIObjectMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class AAIInstanceGroupResources { + @Autowired + private InjectionHelper injectionHelper; + + @Autowired + private AAIObjectMapper aaiObjectMapper; + + public void createInstanceGroup(InstanceGroup instanceGroup) { + AAIResourceUri instanceGroupUri = AAIUriFactory.createResourceUri(AAIObjectType.INSTANCE_GROUP, instanceGroup.getId()); + org.onap.aai.domain.yang.InstanceGroup aaiInstanceGroup = aaiObjectMapper.mapInstanceGroup(instanceGroup); + injectionHelper.getAaiClient().createIfNotExists(instanceGroupUri, Optional.of(aaiInstanceGroup)); + } + + public void deleteInstanceGroup(InstanceGroup instanceGroup) { + AAIResourceUri instanceGroupUri = AAIUriFactory.createResourceUri(AAIObjectType.INSTANCE_GROUP, instanceGroup.getId()); + injectionHelper.getAaiClient().delete(instanceGroupUri); + } + + public void connectInstanceGroupToVnf(InstanceGroup instanceGroup, GenericVnf vnf) { + AAIResourceUri instanceGroupUri = AAIUriFactory.createResourceUri(AAIObjectType.INSTANCE_GROUP, instanceGroup.getId()); + AAIResourceUri vnfURI = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnf.getVnfId()); + injectionHelper.getAaiClient().connect(instanceGroupUri, vnfURI); + } + + public boolean exists(InstanceGroup instanceGroup) { + AAIResourceUri instanceGroupUri = AAIUriFactory.createResourceUri(AAIObjectType.INSTANCE_GROUP, instanceGroup.getId()); + return injectionHelper.getAaiClient().exists(instanceGroupUri); + } + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAINetworkResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAINetworkResources.java new file mode 100644 index 0000000000..e4984c921d --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAINetworkResources.java @@ -0,0 +1,157 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.orchestration; + +import java.util.Optional; + +import org.onap.aai.domain.yang.NetworkPolicy; +import org.onap.aai.domain.yang.RouteTableReference; +import org.onap.aai.domain.yang.VpnBinding; +import org.onap.so.bpmn.common.InjectionHelper; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Collection; +import org.onap.so.bpmn.servicedecomposition.bbobjects.InstanceGroup; +import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.client.aai.AAIObjectType; +import org.onap.so.client.aai.entities.AAIResultWrapper; +import org.onap.so.client.aai.entities.uri.AAIResourceUri; +import org.onap.so.client.aai.entities.uri.AAIUriFactory; +import org.onap.so.client.graphinventory.entities.uri.Depth; +import org.onap.so.client.aai.mapper.AAIObjectMapper; +import org.onap.so.db.catalog.beans.OrchestrationStatus; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class AAINetworkResources { + @Autowired + private InjectionHelper injectionHelper; + + @Autowired + private AAIObjectMapper aaiObjectMapper; + + public void updateNetwork(L3Network network) { + AAIResourceUri networkURI = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, network.getNetworkId()); + org.onap.aai.domain.yang.L3Network aaiL3Network = aaiObjectMapper.mapNetwork(network); + injectionHelper.getAaiClient().update(networkURI, aaiL3Network); + } + + public void createNetworkConnectToServiceInstance(L3Network network, ServiceInstance serviceInstance) { + AAIResourceUri networkURI = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, network.getNetworkId()); + network.setOrchestrationStatus(OrchestrationStatus.INVENTORIED); + AAIResourceUri serviceInstanceURI = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, + serviceInstance.getServiceInstanceId()); + org.onap.aai.domain.yang.L3Network aaiL3Network = aaiObjectMapper.mapNetwork(network); + injectionHelper.getAaiClient().createIfNotExists(networkURI, Optional.of(aaiL3Network)).connect(networkURI, serviceInstanceURI); + } + + public void deleteNetwork(L3Network network) { + AAIResourceUri networkURI = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, network.getNetworkId()); + injectionHelper.getAaiClient().delete(networkURI); + } + + public Optional<VpnBinding> getVpnBinding(AAIResourceUri netBindingUri) { + return injectionHelper.getAaiClient().get(netBindingUri).asBean(VpnBinding.class); + } + + public Optional<NetworkPolicy> getNetworkPolicy(AAIResourceUri netPolicyUri) { + return injectionHelper.getAaiClient().get(netPolicyUri).asBean(NetworkPolicy.class); + } + + public Optional<RouteTableReference> getRouteTable(AAIResourceUri rTableUri) { + return injectionHelper.getAaiClient().get(rTableUri).asBean(RouteTableReference.class); + } + + public Optional<org.onap.aai.domain.yang.L3Network> queryNetworkById(L3Network l3network) { + AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK,l3network.getNetworkId()).depth(Depth.ALL); + AAIResultWrapper aaiWrapper = injectionHelper.getAaiClient().get(uri); + return aaiWrapper.asBean(org.onap.aai.domain.yang.L3Network.class); + } + + public AAIResultWrapper queryNetworkWrapperById(L3Network l3network) { + AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK,l3network.getNetworkId()).depth(Depth.ALL); + return injectionHelper.getAaiClient().get(uri); + } + + public void createNetworkInstanceGroup(InstanceGroup instanceGroup) { + AAIResourceUri instanceGroupURI = AAIUriFactory.createResourceUri(AAIObjectType.INSTANCE_GROUP, instanceGroup.getId()); + org.onap.aai.domain.yang.InstanceGroup aaiInstanceGroup = aaiObjectMapper.mapInstanceGroup(instanceGroup); + injectionHelper.getAaiClient().create(instanceGroupURI, aaiInstanceGroup); + } + + public void createNetworkCollection(Collection networkCollection) { + AAIResourceUri networkCollectionURI = AAIUriFactory.createResourceUri(AAIObjectType.COLLECTION, networkCollection.getId()); + networkCollection.setOrchestrationStatus(OrchestrationStatus.INVENTORIED); + org.onap.aai.domain.yang.Collection aaiCollection = aaiObjectMapper.mapCollection(networkCollection); + injectionHelper.getAaiClient().create(networkCollectionURI, aaiCollection); + } + + public void connectNetworkToTenant(L3Network l3network, CloudRegion cloudRegion) { + AAIResourceUri tenantURI = AAIUriFactory.createResourceUri(AAIObjectType.TENANT, + cloudRegion.getCloudOwner(), cloudRegion.getLcpCloudRegionId(), cloudRegion.getTenantId()); + AAIResourceUri networkURI = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, l3network.getNetworkId()); + injectionHelper.getAaiClient().connect(tenantURI, networkURI); + } + + public void connectNetworkToCloudRegion(L3Network l3network, CloudRegion cloudRegion) { + AAIResourceUri cloudRegionURI = AAIUriFactory.createResourceUri(AAIObjectType.CLOUD_REGION, + cloudRegion.getCloudOwner(), cloudRegion.getLcpCloudRegionId()); + AAIResourceUri networkURI = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, l3network.getNetworkId()); + injectionHelper.getAaiClient().connect(cloudRegionURI, networkURI); + } + + public void connectNetworkToNetworkCollectionInstanceGroup(L3Network l3network, InstanceGroup instanceGroup) { + AAIResourceUri netwrokCollectionInstanceGroupURI = AAIUriFactory.createResourceUri(AAIObjectType.INSTANCE_GROUP, instanceGroup.getId()); + AAIResourceUri networkURI = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, l3network.getNetworkId()); + injectionHelper.getAaiClient().connect(netwrokCollectionInstanceGroupURI, networkURI); + } + + public void connectNetworkToNetworkCollectionServiceInstance(L3Network l3network, ServiceInstance networkCollectionServiceInstance) { + AAIResourceUri networkCollectionServiceInstanceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, networkCollectionServiceInstance.getServiceInstanceId()); + AAIResourceUri networkURI = AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, l3network.getNetworkId()); + injectionHelper.getAaiClient().connect(networkCollectionServiceInstanceUri, networkURI); + } + + public void connectNetworkCollectionInstanceGroupToNetworkCollection(InstanceGroup instanceGroup, Collection networkCollection) { + AAIResourceUri networkCollectionUri = AAIUriFactory.createResourceUri(AAIObjectType.COLLECTION, networkCollection.getId()); + AAIResourceUri netwrokCollectionInstanceGroupURI = AAIUriFactory.createResourceUri(AAIObjectType.INSTANCE_GROUP, instanceGroup.getId()); + injectionHelper.getAaiClient().connect(networkCollectionUri, netwrokCollectionInstanceGroupURI); + } + + public void connectNetworkCollectionToServiceInstance(Collection networkCollection, ServiceInstance networkCollectionServiceInstance) { + AAIResourceUri networkCollectionUri = AAIUriFactory.createResourceUri(AAIObjectType.COLLECTION, networkCollection.getId()); + AAIResourceUri networkCollectionServiceInstanceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, networkCollectionServiceInstance.getServiceInstanceId()); + injectionHelper.getAaiClient().connect(networkCollectionUri, networkCollectionServiceInstanceUri); + } + + public void deleteCollection(Collection collection) { + AAIResourceUri collectionURI = AAIUriFactory.createResourceUri(AAIObjectType.COLLECTION, collection.getId()); + injectionHelper.getAaiClient().delete(collectionURI); + } + + public void deleteNetworkInstanceGroup(InstanceGroup instanceGroup) { + AAIResourceUri instanceGroupURI = AAIUriFactory.createResourceUri(AAIObjectType.INSTANCE_GROUP, instanceGroup.getId()); + injectionHelper.getAaiClient().delete(instanceGroupURI); + } + + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIServiceInstanceResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIServiceInstanceResources.java new file mode 100644 index 0000000000..b5738dcb40 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIServiceInstanceResources.java @@ -0,0 +1,150 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.orchestration; + +import java.util.Optional; + +import org.onap.so.bpmn.common.InjectionHelper; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer; +import org.onap.so.bpmn.servicedecomposition.bbobjects.OwningEntity; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Project; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.client.aai.AAIObjectPlurals; +import org.onap.so.client.aai.AAIObjectType; +import org.onap.so.client.aai.AAIResourcesClient; +import org.onap.so.client.aai.entities.uri.AAIResourceUri; +import org.onap.so.client.aai.entities.uri.AAIUriFactory; +import org.onap.so.client.aai.mapper.AAIObjectMapper; +import org.onap.so.db.catalog.beans.OrchestrationStatus; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class AAIServiceInstanceResources { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, AAIServiceInstanceResources.class); + + @Autowired + private InjectionHelper injectionHelper; + + @Autowired + private AAIObjectMapper aaiObjectMapper; + + public boolean existsServiceInstance(ServiceInstance serviceInstance) { + AAIResourceUri serviceInstanceURI = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, + serviceInstance.getServiceInstanceId()); + return injectionHelper.getAaiClient().exists(serviceInstanceURI); + } + + public void createServiceInstance(ServiceInstance serviceInstance, Customer customer) { + AAIResourceUri serviceInstanceURI = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, + customer.getGlobalCustomerId(), customer.getServiceSubscription().getServiceType(), serviceInstance.getServiceInstanceId()); + serviceInstance.setOrchestrationStatus(OrchestrationStatus.INVENTORIED); + org.onap.aai.domain.yang.ServiceInstance AAIServiceInstance = aaiObjectMapper.mapServiceInstance(serviceInstance); + injectionHelper.getAaiClient().createIfNotExists(serviceInstanceURI, Optional.of(AAIServiceInstance)); + } + + /** + * Create ServiceSubscription in A&AI + * @param customer + */ + public void createServiceSubscription(Customer customer) { + AAIResourceUri serviceSubscriptionURI = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_SUBSCRIPTION, + customer.getGlobalCustomerId(),customer.getServiceSubscription().getServiceType()); + org.onap.aai.domain.yang.ServiceSubscription serviceSubscription = aaiObjectMapper.mapServiceSubscription(customer.getServiceSubscription()); + injectionHelper.getAaiClient().createIfNotExists(serviceSubscriptionURI , Optional.of(serviceSubscription)); + } + + public void deleteServiceInstance(ServiceInstance serviceInstance) { + AAIResourceUri serviceInstanceURI = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, + serviceInstance.getServiceInstanceId()); + injectionHelper.getAaiClient().delete(serviceInstanceURI); + } + + public void createProject(Project project) { + AAIResourceUri projectURI = AAIUriFactory.createResourceUri(AAIObjectType.PROJECT, project.getProjectName()); + org.onap.aai.domain.yang.Project AAIProject = aaiObjectMapper.mapProject(project); + injectionHelper.getAaiClient().createIfNotExists(projectURI, Optional.of(AAIProject)); + } + + public void createProjectandConnectServiceInstance(Project project, ServiceInstance serviceInstance) { + AAIResourceUri projectURI = AAIUriFactory.createResourceUri(AAIObjectType.PROJECT, project.getProjectName()); + AAIResourceUri serviceInstanceURI = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, + serviceInstance.getServiceInstanceId()); + org.onap.aai.domain.yang.Project AAIProject = aaiObjectMapper.mapProject(project); + injectionHelper.getAaiClient().createIfNotExists(projectURI, Optional.of(AAIProject)).connect(projectURI, serviceInstanceURI); + } + + public void createOwningEntity(OwningEntity owningEntity) { + AAIResourceUri owningEntityURI = AAIUriFactory.createResourceUri(AAIObjectType.OWNING_ENTITY, + owningEntity.getOwningEntityId()); + org.onap.aai.domain.yang.OwningEntity AAIOwningEntity = aaiObjectMapper.mapOwningEntity(owningEntity); + injectionHelper.getAaiClient().createIfNotExists(owningEntityURI, Optional.of(AAIOwningEntity)); + } + + public boolean existsOwningEntity(OwningEntity owningEntity) { + AAIResourceUri owningEntityUri = AAIUriFactory.createResourceUri(AAIObjectType.OWNING_ENTITY, + owningEntity.getOwningEntityId()); + return injectionHelper.getAaiClient().exists(owningEntityUri); + } + + public boolean existsOwningEntityName(String owningEntityName) { + AAIResourceUri owningEntityUri = AAIUriFactory.createResourceUri(AAIObjectPlurals.OWNING_ENTITIES).queryParam("owning-entity-name", owningEntityName); + AAIResourcesClient aaiRC = injectionHelper.getAaiClient(); + return aaiRC.exists(owningEntityUri); + } + + public void connectOwningEntityandServiceInstance(OwningEntity owningEntity, ServiceInstance serviceInstance) { + AAIResourceUri owningEntityURI = AAIUriFactory.createResourceUri(AAIObjectType.OWNING_ENTITY, + owningEntity.getOwningEntityId()); + AAIResourceUri serviceInstanceURI = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, + serviceInstance.getServiceInstanceId()); + injectionHelper.getAaiClient().connect(owningEntityURI, serviceInstanceURI); + } + + public void createOwningEntityandConnectServiceInstance(OwningEntity owningEntity, + ServiceInstance serviceInstance) { + AAIResourceUri owningEntityURI = AAIUriFactory.createResourceUri(AAIObjectType.OWNING_ENTITY, + owningEntity.getOwningEntityId()); + AAIResourceUri serviceInstanceURI = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, + serviceInstance.getServiceInstanceId()); + org.onap.aai.domain.yang.OwningEntity AAIOwningEntity = aaiObjectMapper.mapOwningEntity(owningEntity); + injectionHelper.getAaiClient().createIfNotExists(owningEntityURI, Optional.of(AAIOwningEntity)).connect(owningEntityURI, + serviceInstanceURI); + } + + public void updateOrchestrationStatusServiceInstance(ServiceInstance serviceInstance, OrchestrationStatus orchestrationStatus){ + ServiceInstance copiedServiceInstance = serviceInstance.shallowCopyId(); + + copiedServiceInstance.setOrchestrationStatus(orchestrationStatus); + copiedServiceInstance.setServiceInstanceName(serviceInstance.getServiceInstanceName()); + serviceInstance.setOrchestrationStatus(orchestrationStatus); + updateServiceInstance(copiedServiceInstance); + } + + public void updateServiceInstance(ServiceInstance serviceInstance) { + AAIResourceUri serviceInstanceURI = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, serviceInstance.getServiceInstanceId()); + org.onap.aai.domain.yang.ServiceInstance AAIServiceInstance = aaiObjectMapper.mapServiceInstance(serviceInstance); + injectionHelper.getAaiClient().update(serviceInstanceURI, AAIServiceInstance); + } + + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVfModuleResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVfModuleResources.java new file mode 100644 index 0000000000..7fef56d965 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVfModuleResources.java @@ -0,0 +1,81 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.orchestration; + +import java.util.Optional; + +import org.onap.so.bpmn.common.InjectionHelper; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup; +import org.onap.so.client.aai.AAIObjectType; +import org.onap.so.client.aai.entities.uri.AAIResourceUri; +import org.onap.so.client.aai.entities.uri.AAIUriFactory; +import org.onap.so.client.aai.mapper.AAIObjectMapper; +import org.onap.so.db.catalog.beans.OrchestrationStatus; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class AAIVfModuleResources { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, AAIVfModuleResources.class); + + @Autowired + private InjectionHelper injectionHelper; + + @Autowired + private AAIObjectMapper aaiObjectMapper; + + public void createVfModule(VfModule vfModule, GenericVnf vnf) { + AAIResourceUri vfModuleURI = AAIUriFactory.createResourceUri(AAIObjectType.VF_MODULE, vnf.getVnfId(), vfModule.getVfModuleId()); + vfModule.setOrchestrationStatus(OrchestrationStatus.INVENTORIED); + injectionHelper.getAaiClient().createIfNotExists(vfModuleURI, Optional.of(aaiObjectMapper.mapVfModule(vfModule))); + } + + public void deleteVfModule(VfModule vfModule, GenericVnf vnf) { + AAIResourceUri vfModuleURI = AAIUriFactory.createResourceUri(AAIObjectType.VF_MODULE, vnf.getVnfId(), vfModule.getVfModuleId()); + injectionHelper.getAaiClient().delete(vfModuleURI); + } + + public void updateOrchestrationStatusVfModule(VfModule vfModule, GenericVnf vnf, OrchestrationStatus orchestrationStatus) { + AAIResourceUri vfModuleURI = AAIUriFactory.createResourceUri(AAIObjectType.VF_MODULE, vnf.getVnfId(), vfModule.getVfModuleId()); + VfModule copiedVfModule = vfModule.shallowCopyId(); + + vfModule.setOrchestrationStatus(orchestrationStatus); + copiedVfModule.setOrchestrationStatus(orchestrationStatus); + org.onap.aai.domain.yang.VfModule aaiVfModule = aaiObjectMapper.mapVfModule(copiedVfModule); + injectionHelper.getAaiClient().update(vfModuleURI, aaiVfModule); + } + + public void changeAssignVfModule(VfModule vfModule, GenericVnf vnf) { + AAIResourceUri vfModuleURI = AAIUriFactory.createResourceUri(AAIObjectType.VF_MODULE, vnf.getVnfId(), vfModule.getVfModuleId()); + org.onap.aai.domain.yang.VfModule AAIVfModule = aaiObjectMapper.mapVfModule(vfModule); + injectionHelper.getAaiClient().update(vfModuleURI, AAIVfModule); + } + + public void connectVfModuleToVolumeGroup(GenericVnf vnf, VfModule vfModule, VolumeGroup volumeGroup, CloudRegion cloudRegion) { + AAIResourceUri vfModuleURI = AAIUriFactory.createResourceUri(AAIObjectType.VF_MODULE, vnf.getVnfId(), vfModule.getVfModuleId()); + AAIResourceUri volumeGroupURI = AAIUriFactory.createResourceUri(AAIObjectType.VOLUME_GROUP, cloudRegion.getCloudOwner(), cloudRegion.getLcpCloudRegionId(), volumeGroup.getVolumeGroupId()); + injectionHelper.getAaiClient().connect(vfModuleURI, volumeGroupURI); + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVnfResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVnfResources.java new file mode 100644 index 0000000000..19025b4b9f --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVnfResources.java @@ -0,0 +1,113 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.orchestration; + +import java.util.Optional; + +import org.onap.so.bpmn.common.InjectionHelper; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.LineOfBusiness; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Platform; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Project; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup; +import org.onap.so.client.aai.AAIObjectType; +import org.onap.so.client.aai.entities.uri.AAIResourceUri; +import org.onap.so.client.aai.entities.uri.AAIUriFactory; +import org.onap.so.client.aai.mapper.AAIObjectMapper; +import org.onap.so.db.catalog.beans.OrchestrationStatus; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class AAIVnfResources { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, AAIVnfResources.class); + + @Autowired + private InjectionHelper injectionHelper; + + @Autowired + private AAIObjectMapper aaiObjectMapper; + + public void createVnfandConnectServiceInstance(GenericVnf vnf, ServiceInstance serviceInstance) { + AAIResourceUri vnfURI = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnf.getVnfId()); + vnf.setOrchestrationStatus(OrchestrationStatus.INVENTORIED); + AAIResourceUri serviceInstanceURI = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, + serviceInstance.getServiceInstanceId()); + injectionHelper.getAaiClient().createIfNotExists(vnfURI, Optional.of(aaiObjectMapper.mapVnf(vnf))).connect(vnfURI, serviceInstanceURI); + } + + public void createPlatformandConnectVnf(Platform platform, GenericVnf vnf) { + AAIResourceUri platformURI = AAIUriFactory.createResourceUri(AAIObjectType.PLATFORM, platform.getPlatformName()); + AAIResourceUri vnfURI = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnf.getVnfId()); + injectionHelper.getAaiClient().createIfNotExists(platformURI, Optional.of(platform)).connect(vnfURI, platformURI); + } + + public void createLineOfBusinessandConnectVnf(LineOfBusiness lineOfBusiness, GenericVnf vnf) { + AAIResourceUri lineOfBusinessURI = AAIUriFactory.createResourceUri(AAIObjectType.LINE_OF_BUSINESS, lineOfBusiness.getLineOfBusinessName()); + AAIResourceUri vnfURI = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnf.getVnfId()); + injectionHelper.getAaiClient().createIfNotExists(lineOfBusinessURI, Optional.of(lineOfBusiness)).connect(vnfURI, lineOfBusinessURI); + } + + public void deleteVnf(GenericVnf vnf) { + AAIResourceUri vnfURI = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnf.getVnfId()); + injectionHelper.getAaiClient().delete(vnfURI); + } + + public void updateOrchestrationStatusVnf(GenericVnf vnf, OrchestrationStatus orchestrationStatus) { + AAIResourceUri vnfURI = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnf.getVnfId()); + + GenericVnf copiedVnf = vnf.shallowCopyId(); + + vnf.setOrchestrationStatus(orchestrationStatus); + copiedVnf.setOrchestrationStatus(orchestrationStatus); + injectionHelper.getAaiClient().update(vnfURI, aaiObjectMapper.mapVnf(copiedVnf)); + } + + public void updateObjectVnf(GenericVnf vnf) { + AAIResourceUri vnfUri = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnf.getVnfId()); + injectionHelper.getAaiClient().update(vnfUri, aaiObjectMapper.mapVnf(vnf)); + } + + /** + * Retrieve Generic VNF from AAI using vnf Id + * @param vnfId - vnf-id required vnf + * @return AAI Generic Vnf + */ + public Optional<org.onap.aai.domain.yang.GenericVnf> getGenericVnf( String vnfId) { + return injectionHelper.getAaiClient() + .get(org.onap.aai.domain.yang.GenericVnf.class, AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnfId)); + } + + /** + * Check inMaint flag value of Generic VNF from AAI using vnf Id + * @param vnfId - vnf-id required vnf + * @return inMaint flag value + */ + public boolean checkInMaintFlag(String vnfId) { + org.onap.aai.domain.yang.GenericVnf vnf = injectionHelper.getAaiClient() + .get(org.onap.aai.domain.yang.GenericVnf.class, AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnfId)) + .orElse(new org.onap.aai.domain.yang.GenericVnf()); + return vnf.isInMaint(); + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVolumeGroupResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVolumeGroupResources.java new file mode 100644 index 0000000000..70c6724921 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVolumeGroupResources.java @@ -0,0 +1,77 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.orchestration; + +import org.onap.so.bpmn.common.InjectionHelper; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup; +import org.onap.so.client.aai.AAIObjectType; +import org.onap.so.client.aai.entities.uri.AAIResourceUri; +import org.onap.so.client.aai.entities.uri.AAIUriFactory; +import org.onap.so.client.aai.mapper.AAIObjectMapper; +import org.onap.so.db.catalog.beans.OrchestrationStatus; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class AAIVolumeGroupResources { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, AAIVolumeGroupResources.class); + + @Autowired + private InjectionHelper injectionHelper; + + @Autowired + private AAIObjectMapper aaiObjectMapper; + + public void createVolumeGroup(VolumeGroup volumeGroup, CloudRegion cloudRegion) { + AAIResourceUri uriVolumeGroup = AAIUriFactory.createResourceUri(AAIObjectType.VOLUME_GROUP, cloudRegion.getCloudOwner(), cloudRegion.getLcpCloudRegionId(), volumeGroup.getVolumeGroupId()); + volumeGroup.setOrchestrationStatus(OrchestrationStatus.ASSIGNED); + injectionHelper.getAaiClient().create(uriVolumeGroup, aaiObjectMapper.mapVolumeGroup(volumeGroup)); + } + + public void updateOrchestrationStatusVolumeGroup(VolumeGroup volumeGroup, CloudRegion cloudRegion, OrchestrationStatus orchestrationStatus) { + AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.VOLUME_GROUP, cloudRegion.getCloudOwner(), cloudRegion.getLcpCloudRegionId(), volumeGroup.getVolumeGroupId()); + VolumeGroup copiedVolumeGroup = volumeGroup.shallowCopyId(); + + volumeGroup.setOrchestrationStatus(orchestrationStatus); + copiedVolumeGroup.setOrchestrationStatus(orchestrationStatus); + injectionHelper.getAaiClient().update(uri, aaiObjectMapper.mapVolumeGroup(copiedVolumeGroup)); + } + + public void connectVolumeGroupToVnf(GenericVnf genericVnf, VolumeGroup volumeGroup, CloudRegion cloudRegion) { + AAIResourceUri uriGenericVnf = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, genericVnf.getVnfId()); + AAIResourceUri uriVolumeGroup = AAIUriFactory.createResourceUri(AAIObjectType.VOLUME_GROUP, cloudRegion.getCloudOwner(), cloudRegion.getLcpCloudRegionId(), volumeGroup.getVolumeGroupId()); + injectionHelper.getAaiClient().connect(uriGenericVnf, uriVolumeGroup); + } + + public void connectVolumeGroupToTenant(VolumeGroup volumeGroup , CloudRegion cloudRegion) { + AAIResourceUri uriTenant = AAIUriFactory.createResourceUri(AAIObjectType.TENANT, cloudRegion.getCloudOwner(), cloudRegion.getLcpCloudRegionId(),cloudRegion.getTenantId()); + AAIResourceUri uriVolumeGroup = AAIUriFactory.createResourceUri(AAIObjectType.VOLUME_GROUP, cloudRegion.getCloudOwner(), cloudRegion.getLcpCloudRegionId(), volumeGroup.getVolumeGroupId()); + injectionHelper.getAaiClient().connect(uriTenant, uriVolumeGroup); + } + + public void deleteVolumeGroup(VolumeGroup volumeGroup, CloudRegion cloudRegion) { + AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.VOLUME_GROUP, cloudRegion.getCloudOwner(), cloudRegion.getLcpCloudRegionId(), volumeGroup.getVolumeGroupId()); + injectionHelper.getAaiClient().delete(uri); + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVpnBindingResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVpnBindingResources.java new file mode 100644 index 0000000000..8bd55f0f90 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVpnBindingResources.java @@ -0,0 +1,101 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.orchestration; + +import java.util.Optional; + +import javax.ws.rs.NotFoundException; + +import org.onap.aai.domain.yang.VpnBindings; +import org.onap.so.bpmn.common.InjectionHelper; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VpnBinding; +import org.onap.so.client.aai.AAIObjectType; +import org.onap.so.client.aai.entities.uri.AAIResourceUri; +import org.onap.so.client.aai.entities.uri.AAIUriFactory; +import org.onap.so.client.aai.mapper.AAIObjectMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class AAIVpnBindingResources { + @Autowired + private InjectionHelper injectionHelper; + + @Autowired + private AAIObjectMapper aaiObjectMapper; + + /** + * @param customer + */ + public boolean existsCustomer(Customer customer) { + AAIResourceUri uriCustomer = AAIUriFactory.createResourceUri(AAIObjectType.CUSTOMER, customer.getGlobalCustomerId()); + return injectionHelper.getAaiClient().exists(uriCustomer); + } + + /** + * @param customerVpnId + * @return + */ + public Optional<VpnBindings> getVpnBindingByCustomerVpnId (String customerVpnId) { + AAIResourceUri aaiVpnBindingsResourceUri = AAIUriFactory.createResourceUri(AAIObjectType.VPN_BINDINGS) + .queryParam("customer-vpn-id",customerVpnId); + return injectionHelper.getAaiClient().get(VpnBindings.class,aaiVpnBindingsResourceUri); + + } + + /** + * @param vpnBinding + */ + public void createVpnBinding(VpnBinding vpnBinding) { + AAIResourceUri aaiVpnBindingResourceUri = AAIUriFactory.createResourceUri(AAIObjectType.VPN_BINDING,vpnBinding.getVpnId()); + injectionHelper.getAaiClient().create(aaiVpnBindingResourceUri, aaiObjectMapper.mapVpnBinding(vpnBinding)); + } + + /** + * @param customer + */ + public void createCustomer(Customer customer) { + AAIResourceUri uriCustomer = AAIUriFactory.createResourceUri(AAIObjectType.CUSTOMER, customer.getGlobalCustomerId()); + injectionHelper.getAaiClient().create(uriCustomer, aaiObjectMapper.mapCustomer(customer)); + } + + /** + * Retrieve VPN Binding from AAI using vpn-id + * @param vpnId - vpn-id required VPN Binding + * @return AAI VPN Binding + */ + public Optional<org.onap.aai.domain.yang.VpnBinding> getVpnBinding(String vpnId){ + return injectionHelper.getAaiClient() + .get(org.onap.aai.domain.yang.VpnBinding.class, AAIUriFactory.createResourceUri(AAIObjectType.VPN_BINDING, vpnId)); + } + + + /** + * @param globalSubscriberId + * @param vpnId + */ + public void connectCustomerToVpnBinding(String globalSubscriberId, String vpnId) { + AAIResourceUri customerURI = AAIUriFactory.createResourceUri(AAIObjectType.CUSTOMER, globalSubscriberId); + AAIResourceUri vpnBindingURI = AAIUriFactory.createResourceUri(AAIObjectType.VPN_BINDING,vpnId); + injectionHelper.getAaiClient().connect(customerURI, vpnBindingURI); + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/NetworkAdapterResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/NetworkAdapterResources.java new file mode 100644 index 0000000000..3e2b66befa --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/NetworkAdapterResources.java @@ -0,0 +1,83 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.orchestration; + +import java.io.UnsupportedEncodingException; +import java.util.Map; +import java.util.Optional; + +import org.onap.so.adapters.nwrest.CreateNetworkRequest; +import org.onap.so.adapters.nwrest.CreateNetworkResponse; +import org.onap.so.adapters.nwrest.DeleteNetworkRequest; +import org.onap.so.adapters.nwrest.DeleteNetworkResponse; +import org.onap.so.adapters.nwrest.RollbackNetworkRequest; +import org.onap.so.adapters.nwrest.RollbackNetworkResponse; +import org.onap.so.adapters.nwrest.UpdateNetworkRequest; +import org.onap.so.adapters.nwrest.UpdateNetworkResponse; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer; +import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.generalobjects.OrchestrationContext; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.client.adapter.network.NetworkAdapterClientException; +import org.onap.so.client.adapter.network.NetworkAdapterClientImpl; +import org.onap.so.client.adapter.network.mapper.NetworkAdapterObjectMapper; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class NetworkAdapterResources { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, NetworkAdapterResources.class); + + @Autowired + private NetworkAdapterClientImpl networkAdapterClient; + + @Autowired + private NetworkAdapterObjectMapper networkAdapterObjectMapper; + + public Optional<CreateNetworkResponse> createNetwork(RequestContext requestContext, CloudRegion cloudRegion, OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, L3Network l3Network, Map<String, String> userInput, String cloudRegionPo, Customer customer) throws UnsupportedEncodingException, NetworkAdapterClientException { + + CreateNetworkRequest createNetworkRequest = networkAdapterObjectMapper.createNetworkRequestMapper(requestContext, cloudRegion, orchestrationContext, serviceInstance, l3Network, userInput, cloudRegionPo, customer); + return Optional.of(networkAdapterClient.createNetwork(createNetworkRequest)); + } + + public Optional<RollbackNetworkResponse> rollbackCreateNetwork(RequestContext requestContext, CloudRegion cloudRegion, OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, L3Network l3Network, Map<String, String> userInput, String cloudRegionPo, CreateNetworkResponse createNetworkResponse) throws UnsupportedEncodingException, NetworkAdapterClientException { + + RollbackNetworkRequest rollbackNetworkRequest = null; + rollbackNetworkRequest = networkAdapterObjectMapper.createNetworkRollbackRequestMapper(requestContext, cloudRegion, orchestrationContext, serviceInstance, l3Network, userInput, cloudRegionPo, createNetworkResponse); + + return Optional.of(networkAdapterClient.rollbackNetwork(l3Network.getNetworkId(), rollbackNetworkRequest)); + } + + public Optional<UpdateNetworkResponse> updateNetwork(RequestContext requestContext, CloudRegion cloudRegion, OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, L3Network l3Network, Map<String, String> userInput, Customer customer) throws UnsupportedEncodingException, NetworkAdapterClientException { + UpdateNetworkRequest updateNetworkRequest = networkAdapterObjectMapper.createNetworkUpdateRequestMapper(requestContext, cloudRegion, orchestrationContext, serviceInstance, l3Network, userInput, customer); + + return Optional.of(networkAdapterClient.updateNetwork(l3Network.getNetworkId(), updateNetworkRequest)); + } + + public Optional<DeleteNetworkResponse> deleteNetwork(RequestContext requestContext, CloudRegion cloudRegion, ServiceInstance serviceInstance, L3Network l3Network) throws UnsupportedEncodingException, NetworkAdapterClientException { + + DeleteNetworkRequest deleteNetworkRequest = networkAdapterObjectMapper.deleteNetworkRequestMapper(requestContext, cloudRegion, serviceInstance, l3Network); + return Optional.of(networkAdapterClient.deleteNetwork(l3Network.getNetworkId(), deleteNetworkRequest)); + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/SDNCConfigurationResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/SDNCConfigurationResources.java new file mode 100644 index 0000000000..66256ca72e --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/SDNCConfigurationResources.java @@ -0,0 +1,130 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.orchestration; + + +import org.onap.so.bpmn.servicedecomposition.bbobjects.Configuration; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer; +import org.onap.so.client.exception.BadResponseException; +import org.onap.so.client.exception.MapperException; +import org.onap.so.client.sdnc.SDNCClient; +import org.onap.so.client.sdnc.beans.SDNCSvcAction; +import org.onap.so.client.sdnc.endpoint.SDNCTopology; +import org.onap.so.client.sdnc.mapper.GCTopologyOperationRequestMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import org.onap.sdnc.apps.client.model.GenericResourceApiGcTopologyOperationInformation; +import org.onap.sdnc.apps.client.model.GenericResourceApiRequestActionEnumeration; + +@Component +public class SDNCConfigurationResources { + @Autowired + private GCTopologyOperationRequestMapper sdncRM; + + @Autowired + private SDNCClient sdncClient; + + /** + * SDN-C call to assign configuration after it was created in A&AI + * + * @param serviceInstance + * @param requestContext + * @param vnrConfiguration + * @param voiceVnf + * @return + * @throws MapperException + * @throws BadResponseException + */ + public String assignVnrConfiguration(ServiceInstance serviceInstance, + RequestContext requestContext, + Customer customer, + Configuration vnrConfiguration, + GenericVnf voiceVnf) + throws MapperException, BadResponseException { + GenericResourceApiGcTopologyOperationInformation sdncReq = sdncRM.assignOrActivateVnrReqMapper( + SDNCSvcAction.ASSIGN, + GenericResourceApiRequestActionEnumeration.CREATEGENERICCONFIGURATIONINSTANCE , + serviceInstance , requestContext, customer, vnrConfiguration,voiceVnf); + return sdncClient.post(sdncReq, SDNCTopology.CONFIGURATION); + } + + /** + * SDNC Call to Activate VNR Configuration + * + * @param serviceInstance + * @param requestContext + * @param vnrConfiguration + * @param voiceVnf + * @return + * @throws MapperException + * @throws BadResponseException + */ + public String activateVnrConfiguration(ServiceInstance serviceInstance, + RequestContext requestContext, + Customer customer, + Configuration vnrConfiguration, + GenericVnf voiceVnf) + throws MapperException, BadResponseException { + + GenericResourceApiGcTopologyOperationInformation sdncReq = sdncRM.assignOrActivateVnrReqMapper( + SDNCSvcAction.ACTIVATE, + GenericResourceApiRequestActionEnumeration.CREATEGENERICCONFIGURATIONINSTANCE , + serviceInstance , requestContext, customer, vnrConfiguration, voiceVnf); + return sdncClient.post(sdncReq, SDNCTopology.CONFIGURATION); + } + + /** + * method to unAssign Vnr Configuration in SDNC + * + * @param serviceInstance + * @param requestContext + * @param vnrConfiguration + * @return + * @throws BadResponseException + * @throws MapperException + */ + public String unAssignVnrConfiguration(ServiceInstance serviceInstance, RequestContext requestContext, + Configuration vnrConfiguration) throws BadResponseException, MapperException { + + GenericResourceApiGcTopologyOperationInformation sdncReq = sdncRM.deactivateOrUnassignVnrReqMapper + (SDNCSvcAction.UNASSIGN,serviceInstance, requestContext, vnrConfiguration); + return sdncClient.post(sdncReq, SDNCTopology.CONFIGURATION); + } + + /*** + * Deactivate VNR SDNC Call + * @param serviceInstance + * @param requestContext + * @param vnrConfiguration + * @throws BadResponseException + * @throws MapperException + */ + public String deactivateVnrConfiguration(ServiceInstance serviceInstance, RequestContext requestContext, Configuration vnrConfiguration) throws BadResponseException, MapperException { + GenericResourceApiGcTopologyOperationInformation sdncReq = sdncRM.deactivateOrUnassignVnrReqMapper( + SDNCSvcAction.DEACTIVATE, + serviceInstance , requestContext, vnrConfiguration); + return sdncClient.post(sdncReq, SDNCTopology.CONFIGURATION); + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/SDNCNetworkResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/SDNCNetworkResources.java new file mode 100644 index 0000000000..02dd1e418d --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/SDNCNetworkResources.java @@ -0,0 +1,111 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.orchestration; + +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer; +import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.client.exception.BadResponseException; +import org.onap.so.client.exception.MapperException; +import org.onap.so.client.sdnc.SDNCClient; +import org.onap.so.client.sdnc.beans.SDNCSvcAction; +import org.onap.so.client.sdnc.beans.SDNCSvcOperation; +import org.onap.so.client.sdnc.endpoint.SDNCTopology; +import org.onap.so.client.sdnc.mapper.NetworkTopologyOperationRequestMapper; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import org.onap.sdnc.apps.client.model.GenericResourceApiNetworkOperationInformation; +import org.onap.sdnc.apps.client.model.GenericResourceApiRequestActionEnumeration; + +@Component +public class SDNCNetworkResources { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, SDNCNetworkResources.class); + + @Autowired + private NetworkTopologyOperationRequestMapper sdncRM; + + @Autowired + private SDNCClient sdncClient; + + public String assignNetwork(L3Network network, ServiceInstance serviceInstance, Customer customer, + RequestContext requestContext, CloudRegion cloudRegion) + throws MapperException, BadResponseException { + + GenericResourceApiNetworkOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, + SDNCSvcAction.ASSIGN, GenericResourceApiRequestActionEnumeration.CREATENETWORKINSTANCE, network, serviceInstance, customer, requestContext, cloudRegion); + return sdncClient.post(sdncReq, SDNCTopology.NETWORK); + } + + public String rollbackAssignNetwork(L3Network network, ServiceInstance serviceInstance, Customer customer, + RequestContext requestContext, CloudRegion cloudRegion) + throws MapperException, BadResponseException { + + GenericResourceApiNetworkOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, + SDNCSvcAction.UNASSIGN, GenericResourceApiRequestActionEnumeration.DELETENETWORKINSTANCE, network, serviceInstance, customer, requestContext, cloudRegion); + return sdncClient.post(sdncReq, SDNCTopology.NETWORK); + } + + public String activateNetwork(L3Network network, ServiceInstance serviceInstance, Customer customer, + RequestContext requestContext, CloudRegion cloudRegion) + throws MapperException, BadResponseException { + + GenericResourceApiNetworkOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, + SDNCSvcAction.ACTIVATE, GenericResourceApiRequestActionEnumeration.CREATENETWORKINSTANCE, network, serviceInstance, customer, requestContext, cloudRegion); + return sdncClient.post(sdncReq, SDNCTopology.NETWORK); + } + + public String deactivateNetwork(L3Network network, ServiceInstance serviceInstance, Customer customer, RequestContext requestContext, CloudRegion cloudRegion) throws MapperException, BadResponseException { + GenericResourceApiNetworkOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, + SDNCSvcAction.DEACTIVATE, GenericResourceApiRequestActionEnumeration.DELETENETWORKINSTANCE, network, serviceInstance, customer, requestContext, cloudRegion); + return sdncClient.post(sdncReq, SDNCTopology.NETWORK); + } + + public String deleteNetwork(L3Network network, ServiceInstance serviceInstance, Customer customer, + RequestContext requestContext, CloudRegion cloudRegion) + throws MapperException, BadResponseException { + + GenericResourceApiNetworkOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, + SDNCSvcAction.DELETE, GenericResourceApiRequestActionEnumeration.DELETENETWORKINSTANCE, network, serviceInstance, customer, requestContext, cloudRegion); + return sdncClient.post(sdncReq, SDNCTopology.NETWORK); + } + + public String changeAssignNetwork(L3Network network, ServiceInstance serviceInstance, Customer customer, + RequestContext requestContext, CloudRegion cloudRegion) + throws MapperException, BadResponseException { + + GenericResourceApiNetworkOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, SDNCSvcAction.CHANGE_ASSIGN, GenericResourceApiRequestActionEnumeration.CREATENETWORKINSTANCE, network, serviceInstance, customer, requestContext, cloudRegion); + return sdncClient.post(sdncReq, SDNCTopology.NETWORK); + } + + public String unassignNetwork(L3Network network, ServiceInstance serviceInstance, Customer customer, + RequestContext requestContext, CloudRegion cloudRegion) + throws MapperException, BadResponseException { + + GenericResourceApiNetworkOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.NETWORK_TOPOLOGY_OPERATION, + SDNCSvcAction.UNASSIGN, GenericResourceApiRequestActionEnumeration.DELETENETWORKINSTANCE, network, serviceInstance, customer, requestContext, cloudRegion); + return sdncClient.post(sdncReq, SDNCTopology.NETWORK); + } + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/SDNCServiceInstanceResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/SDNCServiceInstanceResources.java new file mode 100644 index 0000000000..1357d40604 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/SDNCServiceInstanceResources.java @@ -0,0 +1,124 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.orchestration; + +import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.client.exception.BadResponseException; +import org.onap.so.client.exception.MapperException; +import org.onap.so.client.sdnc.SDNCClient; +import org.onap.so.client.sdnc.beans.SDNCSvcAction; +import org.onap.so.client.sdnc.beans.SDNCSvcOperation; +import org.onap.so.client.sdnc.endpoint.SDNCTopology; +import org.onap.so.client.sdnc.mapper.ServiceTopologyOperationMapper; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import org.onap.sdnc.apps.client.model.GenericResourceApiRequestActionEnumeration; +import org.onap.sdnc.apps.client.model.GenericResourceApiServiceOperationInformation; + +@Component +public class SDNCServiceInstanceResources { + + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, + SDNCServiceInstanceResources.class); + + @Autowired + private ServiceTopologyOperationMapper sdncRM; + + @Autowired + private SDNCClient sdncClient; + + /** + * SDNC call to perform Service Topology Assign for ServiceInsatnce + * @param serviceInstance + * @param customer + * @param requestContext + * @throws MapperException + * @throws BadResponseException + * @return the response as a String + */ + public String assignServiceInstance(ServiceInstance serviceInstance, Customer customer, + RequestContext requestContext) throws MapperException, BadResponseException { + GenericResourceApiServiceOperationInformation sdncReq = sdncRM.reqMapper( + SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION, SDNCSvcAction.ASSIGN,GenericResourceApiRequestActionEnumeration.CREATESERVICEINSTANCE, serviceInstance, customer, + requestContext); + return sdncClient.post(sdncReq, SDNCTopology.SERVICE); + } + + /** + * SDNC call to perform Service Topology Delete for ServiceInsatnce + * @param serviceInstance + * @param customer + * @param requestContext + * @throws MapperException + * @throws BadResponseException + * @return the response as a String + */ + public String deleteServiceInstance(ServiceInstance serviceInstance, Customer customer, + RequestContext requestContext) throws MapperException, BadResponseException { + GenericResourceApiServiceOperationInformation sdncReq = sdncRM.reqMapper( + SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION, SDNCSvcAction.DELETE, GenericResourceApiRequestActionEnumeration.DELETESERVICEINSTANCE, serviceInstance, customer, + requestContext); + return sdncClient.post(sdncReq, SDNCTopology.SERVICE); + } + + public String unassignServiceInstance(ServiceInstance serviceInstance, Customer customer, + RequestContext requestContext) throws MapperException, BadResponseException { + GenericResourceApiServiceOperationInformation sdncReq = sdncRM.reqMapper( + SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION, SDNCSvcAction.DELETE, GenericResourceApiRequestActionEnumeration.DELETESERVICEINSTANCE, serviceInstance, customer, + requestContext); + return sdncClient.post(sdncReq, SDNCTopology.SERVICE); + } + + /** + * SDNC call to perform Service Topology Deactivate for ServiceInstance + * @param serviceInstance + * @param customer + * @param requestContext + * @throws MapperException + * @throws BadResponseException + * @return the response as a String + */ + public String deactivateServiceInstance(ServiceInstance serviceInstance, Customer customer, + RequestContext requestContext) throws MapperException, BadResponseException { + GenericResourceApiServiceOperationInformation sdncReq = sdncRM.reqMapper( + SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION, SDNCSvcAction.DEACTIVATE, GenericResourceApiRequestActionEnumeration.DELETESERVICEINSTANCE, serviceInstance, customer, + requestContext); + return sdncClient.post(sdncReq, SDNCTopology.SERVICE); + } + + /** + * SDNC call to perform Service Topology Change Assign for the ServiceInstance + * @param serviceInstance + * @param customer + * @param requestContext + * @throws MapperException + * @throws BadResponseException + * @return the response as a String + */ + public String changeModelServiceInstance(ServiceInstance serviceInstance, Customer customer, RequestContext requestContext) throws MapperException, BadResponseException { + GenericResourceApiServiceOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.SERVICE_TOPOLOGY_OPERATION, SDNCSvcAction.CHANGE_ASSIGN, GenericResourceApiRequestActionEnumeration.CREATESERVICEINSTANCE, serviceInstance, customer, requestContext); + return sdncClient.post(sdncReq, SDNCTopology.SERVICE); + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/SDNCVfModuleResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/SDNCVfModuleResources.java new file mode 100644 index 0000000000..e2146dda99 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/SDNCVfModuleResources.java @@ -0,0 +1,99 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.orchestration; + +import org.onap.sdnc.apps.client.model.GenericResourceApiVfModuleOperationInformation; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.client.exception.BadResponseException; +import org.onap.so.client.exception.MapperException; +import org.onap.so.client.sdnc.SDNCClient; +import org.onap.so.client.sdnc.beans.SDNCSvcAction; +import org.onap.so.client.sdnc.beans.SDNCSvcOperation; +import org.onap.so.client.sdnc.endpoint.SDNCTopology; +import org.onap.so.client.sdnc.mapper.VfModuleTopologyOperationRequestMapper; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class SDNCVfModuleResources { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, SDNCVfModuleResources.class); + + @Autowired + private VfModuleTopologyOperationRequestMapper sdncRM; + + @Autowired + private SDNCClient sdncClient; + + public String assignVfModule(VfModule vfModule, VolumeGroup volumeGroup,GenericVnf vnf, ServiceInstance serviceInstance, Customer customer, + CloudRegion cloudRegion, RequestContext requestContext) + throws MapperException, BadResponseException { + + GenericResourceApiVfModuleOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION, + SDNCSvcAction.ASSIGN, vfModule, volumeGroup, vnf, serviceInstance, customer, cloudRegion, requestContext, null); + return sdncClient.post(sdncReq, SDNCTopology.VFMODULE); + } + + public String unassignVfModule(VfModule vfModule, GenericVnf vnf, ServiceInstance serviceInstance) + throws MapperException, BadResponseException { + + GenericResourceApiVfModuleOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION, + SDNCSvcAction.UNASSIGN, vfModule, null, vnf, serviceInstance, null, null, null, null); + return sdncClient.post(sdncReq, SDNCTopology.VFMODULE); + } + + public String deactivateVfModule(VfModule vfModule, GenericVnf vnf, ServiceInstance serviceInstance, + Customer customer, CloudRegion cloudRegion, RequestContext requestContext) + throws MapperException, BadResponseException { + + GenericResourceApiVfModuleOperationInformation sdncReq = sdncRM.reqMapper( + SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION, SDNCSvcAction.DEACTIVATE, vfModule, null, vnf, serviceInstance, + customer, cloudRegion, requestContext, null); + return sdncClient.post(sdncReq, SDNCTopology.VFMODULE); + } + + public String queryVfModule(VfModule vfModule) + throws MapperException, BadResponseException { + + String objectPath = vfModule.getSelflink(); + return sdncClient.get(objectPath); + } + + public String activateVfModule(VfModule vfModule, GenericVnf vnf, ServiceInstance serviceInstance, Customer customer, + CloudRegion cloudRegion, RequestContext requestContext) + throws MapperException, BadResponseException { + + GenericResourceApiVfModuleOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION, + SDNCSvcAction.ACTIVATE, vfModule, null, vnf, serviceInstance, customer, cloudRegion, requestContext, null); + return sdncClient.post(sdncReq, SDNCTopology.VFMODULE); + } + + public String changeAssignVfModule(VfModule vfModule, GenericVnf vnf, ServiceInstance serviceInstance, Customer customer, CloudRegion cloudRegion, RequestContext requestContext) throws MapperException, BadResponseException { + GenericResourceApiVfModuleOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.VF_MODULE_TOPOLOGY_OPERATION, SDNCSvcAction.CHANGE_ASSIGN, vfModule, null, vnf, serviceInstance, customer, cloudRegion, requestContext, null); + return sdncClient.post(sdncReq, SDNCTopology.VFMODULE); + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/SDNCVnfResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/SDNCVnfResources.java new file mode 100644 index 0000000000..c43deb13d2 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/SDNCVnfResources.java @@ -0,0 +1,105 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.orchestration; + +import org.onap.sdnc.apps.client.model.GenericResourceApiRequestActionEnumeration; +import org.onap.sdnc.apps.client.model.GenericResourceApiVnfOperationInformation; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.client.exception.BadResponseException; +import org.onap.so.client.exception.MapperException; +import org.onap.so.client.sdnc.SDNCClient; +import org.onap.so.client.sdnc.beans.SDNCSvcAction; +import org.onap.so.client.sdnc.beans.SDNCSvcOperation; +import org.onap.so.client.sdnc.endpoint.SDNCTopology; +import org.onap.so.client.sdnc.mapper.VnfTopologyOperationRequestMapper; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class SDNCVnfResources { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, SDNCVnfResources.class); + + @Autowired + private VnfTopologyOperationRequestMapper sdncRM; + + @Autowired + private SDNCClient sdncClient; + + public String assignVnf(GenericVnf vnf, ServiceInstance serviceInstance, Customer customer, + CloudRegion cloudRegion, RequestContext requestContext, boolean homing) + throws MapperException, BadResponseException { + GenericResourceApiVnfOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION, + SDNCSvcAction.ASSIGN,GenericResourceApiRequestActionEnumeration.CREATEVNFINSTANCE, vnf, serviceInstance, customer, cloudRegion, requestContext, homing); + return sdncClient.post(sdncReq, SDNCTopology.VNF); + } + + public String activateVnf(GenericVnf vnf, ServiceInstance serviceInstance, Customer customer, + CloudRegion cloudRegion, RequestContext requestContext) + throws MapperException, BadResponseException { + GenericResourceApiVnfOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION, + SDNCSvcAction.ACTIVATE,GenericResourceApiRequestActionEnumeration.CREATEVNFINSTANCE, vnf, serviceInstance, customer,cloudRegion, requestContext, false); + return sdncClient.post(sdncReq, SDNCTopology.VNF); + } + + + public String deactivateVnf(GenericVnf vnf, ServiceInstance serviceInstance, Customer customer, + CloudRegion cloudRegion, RequestContext requestContext) + throws MapperException, BadResponseException { + GenericResourceApiVnfOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION, + SDNCSvcAction.DEACTIVATE,GenericResourceApiRequestActionEnumeration.DELETEVNFINSTANCE, vnf, serviceInstance, customer,cloudRegion, requestContext, false); + return sdncClient.post(sdncReq, SDNCTopology.VNF); + } + + + public String unassignVnf(GenericVnf vnf, ServiceInstance serviceInstance, Customer customer, + CloudRegion cloudRegion, RequestContext requestContext) + throws MapperException, BadResponseException { + GenericResourceApiVnfOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION, + SDNCSvcAction.UNASSIGN,GenericResourceApiRequestActionEnumeration.DELETEVNFINSTANCE, vnf, serviceInstance, customer, cloudRegion, requestContext, false); + return sdncClient.post(sdncReq, SDNCTopology.VNF); + } + + public String deleteVnf(GenericVnf vnf, ServiceInstance serviceInstance, Customer customer, + CloudRegion cloudRegion, RequestContext requestContext) + throws MapperException, BadResponseException { + GenericResourceApiVnfOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION, + SDNCSvcAction.DEACTIVATE, GenericResourceApiRequestActionEnumeration.DELETEVNFINSTANCE,vnf, serviceInstance, customer, cloudRegion, requestContext, false); + return sdncClient.post(sdncReq, SDNCTopology.VNF); + } + + public String changeModelVnf(GenericVnf vnf, ServiceInstance serviceInstance, Customer customer, + CloudRegion cloudRegion, RequestContext requestContext) + throws MapperException, BadResponseException { + GenericResourceApiVnfOperationInformation sdncReq = sdncRM.reqMapper(SDNCSvcOperation.VNF_TOPOLOGY_OPERATION, + SDNCSvcAction.CHANGE_ASSIGN,GenericResourceApiRequestActionEnumeration.CREATEVNFINSTANCE, vnf, serviceInstance, customer, cloudRegion, requestContext, false); + return sdncClient.post(sdncReq, SDNCTopology.VNF); + } + + public String queryVnf(GenericVnf vnf) throws MapperException, BadResponseException { + String queryPath = vnf.getSelflink(); + return sdncClient.get(queryPath); + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/SDNOHealthCheckResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/SDNOHealthCheckResources.java new file mode 100644 index 0000000000..dac89a495d --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/SDNOHealthCheckResources.java @@ -0,0 +1,53 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.orchestration; + +import java.util.UUID; + +import org.onap.so.bpmn.common.InjectionHelper; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class SDNOHealthCheckResources { + @Autowired + private InjectionHelper injectionHelper; + + /** + * SDNO Call to Check Health Status + * + * @param vnf + * @param requestContext * + * @return healthCheckResult + * @throws + * @throws Exception + */ + public boolean healthCheck(GenericVnf vnf, RequestContext requestContext) throws Exception { + String requestId = requestContext.getMsoRequestId(); + String requestorId = requestContext.getRequestorId(); + String vnfId = vnf.getVnfId(); + UUID uuid = UUID.fromString(requestId); + + return injectionHelper.getSdnoValidator().healthDiagnostic(vnfId, uuid, requestorId); + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/VnfAdapterVfModuleResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/VnfAdapterVfModuleResources.java new file mode 100644 index 0000000000..e52616677d --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/VnfAdapterVfModuleResources.java @@ -0,0 +1,55 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.orchestration; + +import java.io.IOException; + +import org.onap.so.adapters.vnfrest.CreateVfModuleRequest; +import org.onap.so.adapters.vnfrest.DeleteVfModuleRequest; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule; +import org.onap.so.bpmn.servicedecomposition.generalobjects.OrchestrationContext; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.client.adapter.vnf.mapper.VnfAdapterVfModuleObjectMapper; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class VnfAdapterVfModuleResources { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, VnfAdapterVfModuleResources.class); + + @Autowired + private VnfAdapterVfModuleObjectMapper vnfAdapterVfModuleObjectMapper; + + public CreateVfModuleRequest createVfModuleRequest(RequestContext requestContext, CloudRegion cloudRegion, OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, GenericVnf genericVnf, + VfModule vfModule, String sdncVnfQueryResponse, String sdncVfModuleQueryResponse) throws IOException { + return vnfAdapterVfModuleObjectMapper.createVfModuleRequestMapper(requestContext, cloudRegion, orchestrationContext, serviceInstance, genericVnf, vfModule, sdncVnfQueryResponse, sdncVfModuleQueryResponse); + } + + public DeleteVfModuleRequest deleteVfModuleRequest(RequestContext requestContext, CloudRegion cloudRegion, + ServiceInstance serviceInstance, GenericVnf genericVnf, + VfModule vfModule) throws IOException { + return vnfAdapterVfModuleObjectMapper.deleteVfModuleRequestMapper(requestContext, cloudRegion, serviceInstance, genericVnf, vfModule); + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/VnfAdapterVolumeGroupResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/VnfAdapterVolumeGroupResources.java new file mode 100644 index 0000000000..8655104830 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/VnfAdapterVolumeGroupResources.java @@ -0,0 +1,57 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.orchestration; + +import org.onap.so.adapters.vnfrest.CreateVolumeGroupRequest; +import org.onap.so.adapters.vnfrest.DeleteVolumeGroupRequest; +import org.onap.so.adapters.vnfrest.DeleteVolumeGroupResponse; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup; +import org.onap.so.bpmn.servicedecomposition.generalobjects.OrchestrationContext; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.client.adapter.vnf.VnfVolumeAdapterClientImpl; +import org.onap.so.client.adapter.vnf.mapper.VnfAdapterObjectMapper; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class VnfAdapterVolumeGroupResources { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, VnfAdapterVolumeGroupResources.class); + + @Autowired + private VnfAdapterObjectMapper vnfAdapterObjectMapper; + + @Autowired + private VnfVolumeAdapterClientImpl vnfVolumeAdapterClient; + + public CreateVolumeGroupRequest createVolumeGroupRequest(RequestContext requestContext, CloudRegion cloudRegion, OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, GenericVnf genericVnf, VolumeGroup volumeGroup, String sdncVfModuleQueryResponse) throws Exception { + return vnfAdapterObjectMapper.createVolumeGroupRequestMapper(requestContext, cloudRegion, orchestrationContext, serviceInstance, genericVnf, volumeGroup, sdncVfModuleQueryResponse); + } + + public DeleteVolumeGroupResponse deleteVolumeGroup(RequestContext requestContext, CloudRegion cloudRegion, ServiceInstance serviceInstance, VolumeGroup volumeGroup) throws Exception { + DeleteVolumeGroupRequest deleteVolumeGroupRequest = vnfAdapterObjectMapper.deleteVolumeGroupRequestMapper(requestContext, cloudRegion, serviceInstance, volumeGroup); + msoLogger.debug(deleteVolumeGroupRequest.toString()); + return vnfVolumeAdapterClient.deleteVNFVolumes(volumeGroup.getVolumeGroupId(), deleteVolumeGroupRequest); + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/BaseClient.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/BaseClient.java new file mode 100644 index 0000000000..1ce7a92eb5 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/BaseClient.java @@ -0,0 +1,84 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.sdnc; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.util.Collections; + +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.http.client.BufferingClientHttpRequestFactory; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +//TODO move to common location +public class BaseClient<I,O> { + + private HttpHeaders httpHeader; + private String targetUrl; + + public HttpHeaders getHttpHeader() { + return httpHeader; + } + + public void setHttpHeader(HttpHeaders httpHeader) { + this.httpHeader = httpHeader; + } + + public String getTargetUrl() { + return targetUrl; + } + + public void setTargetUrl(String targetUrl) { + this.targetUrl = targetUrl; + } + + public O get(I data, Object... uriVariables) throws RestClientException { + return run(data, HttpMethod.GET, uriVariables); + } + + public O post(I data, Object... uriVariables) throws RestClientException { + return run(data, HttpMethod.POST, uriVariables); + } + + public O run(I data, HttpMethod method, Object... uriVariables) throws RestClientException { + HttpEntity<I> requestEntity = new HttpEntity<I>(data, getHttpHeader()); + RestTemplate restTemplate = new RestTemplate(); + ObjectMapper mapper = new ObjectMapper(); + MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); + converter.setObjectMapper(mapper); + mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY); + restTemplate.getMessageConverters().add(0, converter); + restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory())); + ParameterizedTypeReference<O> output = new ParameterizedTypeReference<O>() {}; + ResponseEntity<O> responseEntity = restTemplate.exchange(getTargetUrl(), method, requestEntity, output, + uriVariables); + return responseEntity.getBody(); + } + +}
\ No newline at end of file diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/SDNCClient.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/SDNCClient.java new file mode 100644 index 0000000000..1f0d654a85 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/SDNCClient.java @@ -0,0 +1,92 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.sdnc; + +import java.util.LinkedHashMap; +import javax.ws.rs.core.UriBuilder; + +import org.onap.so.client.exception.BadResponseException; +import org.onap.so.client.exception.MapperException; +import org.onap.so.client.sdnc.beans.SDNCProperties; +import org.onap.so.client.sdnc.endpoint.SDNCTopology; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.stereotype.Component; + +@Component +public class SDNCClient { + + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, SDNCClient.class); + private BaseClient<String, LinkedHashMap<?, ?>> STOClient = new BaseClient<>(); + + @Autowired + private SDNCProperties properties; + @Autowired + private SdnCommonTasks sdnCommonTasks; + /** + * + * @param request + * - takes in a generated object from sdnc client + * - creates a json request string and sends it to sdnc + * - receives and validates the linkedhashmap sent back from sdnc + * @throws MapperException + * @throws BadResponseException + */ + public String post(Object request, SDNCTopology topology) throws MapperException, BadResponseException { + String jsonRequest = sdnCommonTasks.buildJsonRequest(request); + String targetUrl = properties.getHost() + properties.getPath() + ":" + topology.toString() + "/"; + STOClient.setTargetUrl(targetUrl); + HttpHeaders httpHeader = sdnCommonTasks.getHttpHeaders(properties.getAuth()); + STOClient.setHttpHeader(httpHeader); + msoLogger.info("Running SDNC CLIENT for TargetUrl: " + targetUrl); + LinkedHashMap<?, ?> output = STOClient.post(jsonRequest); + msoLogger.info("Validating output..."); + return sdnCommonTasks.validateSDNResponse(output); + } + + + /** + * + * @param queryLink + * - takes in a link to topology that needs to be queried + * - creates a json request string and sends it to sdnc + * - receives and validates the linkedhashmap sent back from sdnc + * * + * @throws MapperException + * @throws BadResponseException + */ + public String get(String queryLink) throws MapperException, BadResponseException { + + String request = ""; + String jsonRequest = sdnCommonTasks.buildJsonRequest(request); + String targetUrl = UriBuilder.fromUri(properties.getHost()).path(queryLink).build().toString(); + STOClient.setTargetUrl(targetUrl); + msoLogger.info("TargetUrl: " + targetUrl); + HttpHeaders httpHeader = sdnCommonTasks.getHttpHeaders(properties.getAuth()); + STOClient.setHttpHeader(httpHeader); + msoLogger.info("Running SDNC CLIENT..."); + LinkedHashMap<?, ?> output = STOClient.get(jsonRequest); + msoLogger.info("Validating output..."); + return sdnCommonTasks.validateSDNGetResponse(output); + } + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/SdnCommonTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/SdnCommonTasks.java new file mode 100644 index 0000000000..d35296af9b --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/SdnCommonTasks.java @@ -0,0 +1,138 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.sdnc; + +import java.util.LinkedHashMap; + +import org.apache.commons.lang.StringUtils; +import org.apache.http.HttpStatus; +import org.json.JSONObject; +import org.onap.so.client.exception.BadResponseException; +import org.onap.so.client.exception.MapperException; +import org.onap.so.logger.MessageEnum; +import org.onap.so.logger.MsoLogger; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +@Component +public class SdnCommonTasks { + + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, SDNCClient.class); + private static final String RESPONSE_CODE = "response-code"; + private static final String RESPONSE_MESSAGE = "response-message"; + private static final String NO_RESPONSE_FROM_SDNC = "Error did not receive a response from SDNC."; + private static final String BAD_RESPONSE_FROM_SDNC = "Error received a bad response from SDNC."; + private static final String SDNC_CODE_NOT_0_OR_IN_200_299 = "Error from SDNC: %s"; + private static final String COULD_NOT_CONVERT_SDNC_POJO_TO_JSON = "ERROR: Could not convert SDNC pojo to json string."; + + /*** + * + * @param request + * @return + * @throws MapperException + */ + public String buildJsonRequest(Object request) throws MapperException { + String jsonRequest; + ObjectMapper objMapper = new ObjectMapper(); + objMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + try { + jsonRequest = objMapper.writerWithDefaultPrettyPrinter().writeValueAsString(request); + } catch (JsonProcessingException e) { + msoLogger.error(MessageEnum.JAXB_EXCEPTION, COULD_NOT_CONVERT_SDNC_POJO_TO_JSON, "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.DataError, e.getMessage()); + throw new MapperException(COULD_NOT_CONVERT_SDNC_POJO_TO_JSON); + } + jsonRequest = "{\"input\":" + jsonRequest + "}"; + msoLogger.info(jsonRequest); + return jsonRequest; + } + + /*** + * + * @param auth + * @return + */ + public HttpHeaders getHttpHeaders(String auth) { + HttpHeaders httpHeader = new HttpHeaders(); + httpHeader.set("Authorization", auth); + httpHeader.setContentType(MediaType.APPLICATION_JSON); + return httpHeader; + } + + /*** + * + * @param output + * @return + * @throws BadResponseException + */ + public String validateSDNResponse(LinkedHashMap<?, ?> output) throws BadResponseException { + if (CollectionUtils.isEmpty(output)) { + msoLogger.error(MessageEnum.RA_RESPONSE_FROM_SDNC, NO_RESPONSE_FROM_SDNC, "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, NO_RESPONSE_FROM_SDNC); + throw new BadResponseException(NO_RESPONSE_FROM_SDNC); + } + String responseCode = (String) output.get(RESPONSE_CODE); + String responseMessage = (String) output.get(RESPONSE_MESSAGE); + msoLogger.info("ResponseCode: " + responseCode + " ResponseMessage: " + responseMessage); + int code = StringUtils.isNotEmpty(responseCode) ? Integer.parseInt(responseCode) : 0; + if (isHttpCodeSuccess(code)) { + msoLogger.info("Successful Response from SDNC"); + return responseMessage; + } else { + String errorMessage = String.format(SDNC_CODE_NOT_0_OR_IN_200_299, responseMessage); + msoLogger.error(MessageEnum.RA_RESPONSE_FROM_SDNC, errorMessage, "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.DataError, errorMessage); + throw new BadResponseException(errorMessage); + } + } + + /*** + * + * @param output + * @return + * @throws BadResponseException + */ + public String validateSDNGetResponse(LinkedHashMap<?, ?> output) throws BadResponseException { + if (CollectionUtils.isEmpty(output)) { + msoLogger.error(MessageEnum.RA_RESPONSE_FROM_SDNC, NO_RESPONSE_FROM_SDNC, "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, NO_RESPONSE_FROM_SDNC); + throw new BadResponseException(NO_RESPONSE_FROM_SDNC); + } + ObjectMapper objMapper = new ObjectMapper(); + msoLogger.debug("Using object mapper"); + String stringOutput = ""; + try { + stringOutput = objMapper.writeValueAsString(output); + } + catch (Exception e) { + msoLogger.error(MessageEnum.RA_RESPONSE_FROM_SDNC, BAD_RESPONSE_FROM_SDNC, "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, BAD_RESPONSE_FROM_SDNC); + throw new BadResponseException(BAD_RESPONSE_FROM_SDNC); + } + msoLogger.debug("Received from GET request: " + stringOutput); + return stringOutput; + } + + private boolean isHttpCodeSuccess(int code) { + return code >= HttpStatus.SC_OK && code < HttpStatus.SC_MULTIPLE_CHOICES || code == 0; + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/beans/SDNCProperties.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/beans/SDNCProperties.java new file mode 100644 index 0000000000..08be73e3fd --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/beans/SDNCProperties.java @@ -0,0 +1,52 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.sdnc.beans; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConfigurationProperties(prefix="sdnc") +public class SDNCProperties { + + private String host; + private String path; + private String auth; + + public String getHost() { + return host; + } + public void setHost(String host) { + this.host = host; + } + public String getPath() { + return path; + } + public void setPath(String path) { + this.path = path; + } + public String getAuth() { + return auth; + } + public void setAuth(String auth) { + this.auth = auth; + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/beans/SDNCSvcAction.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/beans/SDNCSvcAction.java new file mode 100644 index 0000000000..5f7ebdd867 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/beans/SDNCSvcAction.java @@ -0,0 +1,55 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.sdnc.beans; + +import org.onap.sdnc.apps.client.model.GenericResourceApiSvcActionEnumeration; + +public enum SDNCSvcAction { + ACTIVATE("activate",GenericResourceApiSvcActionEnumeration.ACTIVATE), + DELETE("delete",GenericResourceApiSvcActionEnumeration.DELETE), + ASSIGN("assign",GenericResourceApiSvcActionEnumeration.ASSIGN), + ROLLBACK("rollback",GenericResourceApiSvcActionEnumeration.ROLLBACK), + UNASSIGN("unassign",GenericResourceApiSvcActionEnumeration.UNASSIGN), + DEACTIVATE("deactivate",GenericResourceApiSvcActionEnumeration.DEACTIVATE), + CHANGE_DELETE("changedelete",GenericResourceApiSvcActionEnumeration.CHANGEDELETE), + CHANGE_ASSIGN("changeassign",GenericResourceApiSvcActionEnumeration.CHANGEASSIGN), + CREATE("create",GenericResourceApiSvcActionEnumeration.CREATE), + ENABLE("enable",GenericResourceApiSvcActionEnumeration.ENABLE), + DISABLE("disable",GenericResourceApiSvcActionEnumeration.DISABLE); + + private final String name; + + private GenericResourceApiSvcActionEnumeration sdncApiAction ; + + private SDNCSvcAction(String name , GenericResourceApiSvcActionEnumeration sdncApiAction) { + this.name = name; + this.sdncApiAction = sdncApiAction; + } + + public GenericResourceApiSvcActionEnumeration getSdncApiAction(){ + return this.sdncApiAction; + } + + @Override + public String toString() { + return name; + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/beans/SDNCSvcOperation.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/beans/SDNCSvcOperation.java new file mode 100644 index 0000000000..ba9fedccac --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/beans/SDNCSvcOperation.java @@ -0,0 +1,44 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.sdnc.beans; + +public enum SDNCSvcOperation { + + VF_MODULE_TOPOLOGY_OPERATION("vf-module-topology-operation"), + NETWORK_TOPOLOGY_OPERATION("network-topology-operation"), + VNF_TOPOLOGY_OPERATION("vnf-topology-operation"), + CONTRAIL_ROUTE_TOPOLOGY_OPERATION("contrail-route-topology-operation"), + SECURITY_ZONE_TOPOLOGY_OPERATION("security-zone-topology-operation"), + PORT_MIRROR_TOPOLOGY_OPERATION("port-mirror-topology-operation"), + SERVICE_TOPOLOGY_OPERATION("service-topology-operation"), + GENERIC_CONFIGURATION_TOPOLOGY_OPERATION("generic-configuration-topology-operation"); + + private final String name; + + private SDNCSvcOperation(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/endpoint/SDNCTopology.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/endpoint/SDNCTopology.java new file mode 100644 index 0000000000..a709e80220 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/endpoint/SDNCTopology.java @@ -0,0 +1,44 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.sdnc.endpoint; + +public enum SDNCTopology { + + SERVICE("service-topology-operation"), + VNF("vnf-topology-operation"), + VFMODULE("vf-module-topology-operation"), + CONTRAILROUTE("contrail-route-topology-operation"), + PORTMIRROR("port-mirror-topology-operation"), + NETWORK("network-topology-operation"), + SECURITYZONE("security-zone-topology-operation"), + CONFIGURATION("generic-configuration-topology-operation"); + + private final String topology; + + private SDNCTopology(String topology) { + this.topology = topology; + } + + @Override + public String toString(){ + return this.topology; + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/GCTopologyOperationRequestMapper.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/GCTopologyOperationRequestMapper.java new file mode 100644 index 0000000000..8d71cdd923 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/GCTopologyOperationRequestMapper.java @@ -0,0 +1,86 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.sdnc.mapper; + +import org.onap.sdnc.apps.client.model.*; +import org.onap.so.bpmn.servicedecomposition.bbobjects.*; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.client.sdnc.beans.SDNCSvcAction; +import org.springframework.stereotype.Component; + +@Component(value = "sdncGCTopologyOperationRequestMapper") +public class GCTopologyOperationRequestMapper { + + private static final GeneralTopologyObjectMapper generalTopologyObjectMapper = new GeneralTopologyObjectMapper(); + + public GenericResourceApiGcTopologyOperationInformation assignOrActivateVnrReqMapper(SDNCSvcAction svcAction, + GenericResourceApiRequestActionEnumeration reqAction, + ServiceInstance serviceInstance, + RequestContext requestContext, + Customer customer, + Configuration vnrConfiguration, + GenericVnf voiceVnf) { + + GenericResourceApiGcTopologyOperationInformation req = new GenericResourceApiGcTopologyOperationInformation(); + String sdncReqId = requestContext.getMsoRequestId(); + GenericResourceApiSdncrequestheaderSdncRequestHeader sdncRequestHeader = generalTopologyObjectMapper.buildSdncRequestHeader(svcAction, sdncReqId);// TODO Set URL + GenericResourceApiRequestinformationRequestInformation requestInformation = generalTopologyObjectMapper.buildGenericResourceApiRequestinformationRequestInformation(sdncReqId, reqAction); + GenericResourceApiServiceinformationServiceInformation serviceInformation = generalTopologyObjectMapper.buildServiceInformation(serviceInstance, requestContext, customer, false); + GenericResourceApiConfigurationinformationConfigurationInformation configurationInformation = generalTopologyObjectMapper.buildConfigurationInformation(vnrConfiguration,true); + GenericResourceApiGcrequestinputGcRequestInput gcRequestInput = generalTopologyObjectMapper.buildGcRequestInformation(voiceVnf,null); + req.setRequestInformation(requestInformation); + req.setSdncRequestHeader(sdncRequestHeader); + req.setServiceInformation(serviceInformation); + req.setConfigurationInformation(configurationInformation); + req.setGcRequestInput(gcRequestInput); + + return req; + + } + + + public GenericResourceApiGcTopologyOperationInformation deactivateOrUnassignVnrReqMapper(SDNCSvcAction svcAction, + ServiceInstance serviceInstance, + RequestContext requestContext, + Configuration vnrConfiguration) { + + GenericResourceApiGcTopologyOperationInformation req = new GenericResourceApiGcTopologyOperationInformation(); + String sdncReqId = requestContext.getMsoRequestId(); + GenericResourceApiSdncrequestheaderSdncRequestHeader sdncRequestHeader = + generalTopologyObjectMapper.buildSdncRequestHeader(svcAction, sdncReqId);// TODO Set URL + GenericResourceApiRequestinformationRequestInformation requestInformation = generalTopologyObjectMapper + .buildGenericResourceApiRequestinformationRequestInformation(sdncReqId, + GenericResourceApiRequestActionEnumeration.DELETEGENERICCONFIGURATIONINSTANCE); + GenericResourceApiServiceinformationServiceInformation serviceInformation = new GenericResourceApiServiceinformationServiceInformation(); + serviceInformation.setServiceInstanceId(serviceInstance.getServiceInstanceId()); + GenericResourceApiConfigurationinformationConfigurationInformation configurationInformation = + new GenericResourceApiConfigurationinformationConfigurationInformation(); + configurationInformation.setConfigurationId(vnrConfiguration.getConfigurationId()); + req.setRequestInformation(requestInformation); + req.setSdncRequestHeader(sdncRequestHeader); + req.setServiceInformation(serviceInformation); + req.setConfigurationInformation(configurationInformation); + return req; + + } + + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/GeneralTopologyObjectMapper.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/GeneralTopologyObjectMapper.java new file mode 100644 index 0000000000..a62168e9a2 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/GeneralTopologyObjectMapper.java @@ -0,0 +1,172 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.sdnc.mapper; + +import org.onap.sdnc.apps.client.model.*; +import org.onap.so.bpmn.servicedecomposition.bbobjects.*; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.client.sdnc.beans.SDNCSvcAction; +import org.springframework.stereotype.Component; + +@Component +public class GeneralTopologyObjectMapper { + + /* + * Build GenericResourceApiRequestinformationRequestInformation + */ + public GenericResourceApiRequestinformationRequestInformation buildGenericResourceApiRequestinformationRequestInformation(String sdncReqId, GenericResourceApiRequestActionEnumeration requestAction){ + + GenericResourceApiRequestinformationRequestInformation requestInformation = new GenericResourceApiRequestinformationRequestInformation(); + requestInformation.setRequestId(sdncReqId); + requestInformation.setRequestAction(requestAction); + requestInformation.setSource("MSO"); + return requestInformation; + } + /* + * Build GenericResourceApiServiceinformationServiceInformation + */ + public GenericResourceApiServiceinformationServiceInformation buildServiceInformation(ServiceInstance serviceInstance, RequestContext requestContext, Customer customer, boolean includeModelInformation){ + GenericResourceApiServiceinformationServiceInformation serviceInformation = new GenericResourceApiServiceinformationServiceInformation(); + serviceInformation.serviceId(serviceInstance.getServiceInstanceId()); + if (requestContext != null) { + serviceInformation.setSubscriptionServiceType(requestContext.getProductFamilyId()); + } + if (includeModelInformation) { + GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInformation = new GenericResourceApiOnapmodelinformationOnapModelInformation(); + onapModelInformation.setModelInvariantUuid(serviceInstance.getModelInfoServiceInstance().getModelInvariantUuid()); + onapModelInformation.setModelVersion(serviceInstance.getModelInfoServiceInstance().getModelVersion()); + onapModelInformation.setModelName(serviceInstance.getModelInfoServiceInstance().getModelName()); + onapModelInformation.setModelUuid(serviceInstance.getModelInfoServiceInstance().getModelUuid()); + serviceInformation.setOnapModelInformation(onapModelInformation ); + } + serviceInformation.setServiceInstanceId(serviceInstance.getServiceInstanceId()); + + if (customer != null) { + serviceInformation.setGlobalCustomerId(customer.getGlobalCustomerId()); + if(customer.getServiceSubscription() != null){ + serviceInformation.setSubscriptionServiceType(customer.getServiceSubscription().getServiceType()); + } + + } + return serviceInformation; + } + /* + * Build GenericResourceApiNetworkinformationNetworkInformation + */ + public GenericResourceApiNetworkinformationNetworkInformation buildNetworkInformation(L3Network network){ + GenericResourceApiNetworkinformationNetworkInformation networkInformation = new GenericResourceApiNetworkinformationNetworkInformation(); + GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInformation = new GenericResourceApiOnapmodelinformationOnapModelInformation(); + if (network.getModelInfoNetwork() != null) { + onapModelInformation.setModelInvariantUuid(network.getModelInfoNetwork().getModelInvariantUUID()); + onapModelInformation.setModelName(network.getModelInfoNetwork().getModelName()); + onapModelInformation.setModelVersion(network.getModelInfoNetwork().getModelVersion()); + onapModelInformation.setModelUuid(network.getModelInfoNetwork().getModelUUID()); + onapModelInformation.setModelCustomizationUuid(network.getModelInfoNetwork().getModelCustomizationUUID()); + networkInformation.setOnapModelInformation(onapModelInformation); + } + networkInformation.setNetworkId(network.getNetworkId()); + //TODO fix this after network type filed included in L3Network object type + //networkInformation.setNetworkType(network.getNetwork); + return networkInformation; + } + /* + * Build GenericResourceApiVnfinformationVnfInformation + */ + public GenericResourceApiVnfinformationVnfInformation buildVnfInformation(GenericVnf vnf, ServiceInstance serviceInstance, boolean includeModelInformation){ + GenericResourceApiVnfinformationVnfInformation vnfInformation = new GenericResourceApiVnfinformationVnfInformation(); + if (includeModelInformation && vnf.getModelInfoGenericVnf() != null) { + GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInformation = new GenericResourceApiOnapmodelinformationOnapModelInformation(); + onapModelInformation.setModelInvariantUuid(vnf.getModelInfoGenericVnf().getModelInvariantUuid()); + onapModelInformation.setModelName(vnf.getModelInfoGenericVnf().getModelName()); + onapModelInformation.setModelVersion(vnf.getModelInfoGenericVnf().getModelVersion()); + onapModelInformation.setModelUuid(vnf.getModelInfoGenericVnf().getModelUuid()); + onapModelInformation.setModelCustomizationUuid(vnf.getModelInfoGenericVnf().getModelCustomizationUuid()); + vnfInformation.setOnapModelInformation(onapModelInformation); + } + vnfInformation.setVnfId(vnf.getVnfId()); + vnfInformation.setVnfType(vnf.getVnfType()); + vnfInformation.setVnfName(vnf.getVnfName()); + return vnfInformation; + } + /* + * Build GenericResourceApiVfModuleinformationVfModuleInformation + */ + public GenericResourceApiVfmoduleinformationVfModuleInformation buildVfModuleInformation(VfModule vfModule, GenericVnf vnf, ServiceInstance serviceInstance, boolean includeModelInformation){ + GenericResourceApiVfmoduleinformationVfModuleInformation vfModuleInformation = new GenericResourceApiVfmoduleinformationVfModuleInformation(); + if (includeModelInformation) { + GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInformation = new GenericResourceApiOnapmodelinformationOnapModelInformation(); + onapModelInformation.setModelInvariantUuid(vfModule.getModelInfoVfModule().getModelInvariantUUID()); + onapModelInformation.setModelName(vfModule.getModelInfoVfModule().getModelName()); + onapModelInformation.setModelVersion(vfModule.getModelInfoVfModule().getModelVersion()); + onapModelInformation.setModelUuid(vfModule.getModelInfoVfModule().getModelUUID()); + onapModelInformation.setModelCustomizationUuid(vfModule.getModelInfoVfModule().getModelCustomizationUUID()); + vfModuleInformation.setOnapModelInformation(onapModelInformation); + } + if (vfModule.getModelInfoVfModule() != null) { + vfModuleInformation.setVfModuleType(vfModule.getModelInfoVfModule().getModelName()); + } + vfModuleInformation.setVfModuleId(vfModule.getVfModuleId()); + return vfModuleInformation; + } + public GenericResourceApiSdncrequestheaderSdncRequestHeader buildSdncRequestHeader(SDNCSvcAction svcAction, String sdncReqId){ + GenericResourceApiSdncrequestheaderSdncRequestHeader sdncRequestHeader = new GenericResourceApiSdncrequestheaderSdncRequestHeader(); + sdncRequestHeader.setSvcAction(svcAction.getSdncApiAction()); + sdncRequestHeader.setSvcRequestId(sdncReqId); + return sdncRequestHeader; + } + + /** + * Build ConfigurationInformation + * @param configuration + * @param includeModelInformation + * @return + */ + public GenericResourceApiConfigurationinformationConfigurationInformation buildConfigurationInformation(Configuration configuration, boolean includeModelInformation) { + GenericResourceApiConfigurationinformationConfigurationInformation configurationInformation = new GenericResourceApiConfigurationinformationConfigurationInformation(); + configurationInformation.setConfigurationId(configuration.getConfigurationId()); + configurationInformation.setConfigurationName(configuration.getConfigurationName()); + configurationInformation.setConfigurationType(configuration.getConfigurationType()); + if(includeModelInformation) { + GenericResourceApiOnapmodelinformationOnapModelInformation onapModelInformation = new GenericResourceApiOnapmodelinformationOnapModelInformation(); + onapModelInformation.setModelInvariantUuid(configuration.getModelInfoConfiguration().getModelInvariantId()); + onapModelInformation.setModelUuid(configuration.getModelInfoConfiguration().getModelVersionId()); + onapModelInformation.setModelCustomizationUuid(configuration.getModelInfoConfiguration().getModelCustomizationId()); + configurationInformation.setOnapModelInformation(onapModelInformation); + } + return configurationInformation; + } + + + /** + * Build GcRequestInformation + * @param vnf + * @param genericResourceApiParam + * @return + */ + public GenericResourceApiGcrequestinputGcRequestInput buildGcRequestInformation(GenericVnf vnf,GenericResourceApiParam genericResourceApiParam) { + GenericResourceApiGcrequestinputGcRequestInput gcRequestInput = new GenericResourceApiGcrequestinputGcRequestInput(); + gcRequestInput.setVnfId(vnf.getVnfId()); + if(genericResourceApiParam != null) { + gcRequestInput.setInputParameters(genericResourceApiParam); + } + return gcRequestInput; + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/NetworkTopologyOperationRequestMapper.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/NetworkTopologyOperationRequestMapper.java new file mode 100644 index 0000000000..c55954093b --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/NetworkTopologyOperationRequestMapper.java @@ -0,0 +1,100 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.sdnc.mapper; + +import java.util.Map; +import java.util.UUID; + +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer; +import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.client.sdnc.beans.SDNCSvcAction; +import org.onap.so.client.sdnc.beans.SDNCSvcOperation; +import org.springframework.stereotype.Component; + +import org.onap.sdnc.apps.client.model.GenericResourceApiNetworkOperationInformation; +import org.onap.sdnc.apps.client.model.GenericResourceApiNetworkinformationNetworkInformation; +import org.onap.sdnc.apps.client.model.GenericResourceApiNetworkrequestinputNetworkRequestInput; +import org.onap.sdnc.apps.client.model.GenericResourceApiParam; +import org.onap.sdnc.apps.client.model.GenericResourceApiParamParam; +import org.onap.sdnc.apps.client.model.GenericResourceApiRequestActionEnumeration; +import org.onap.sdnc.apps.client.model.GenericResourceApiRequestinformationRequestInformation; +import org.onap.sdnc.apps.client.model.GenericResourceApiSdncrequestheaderSdncRequestHeader; +import org.onap.sdnc.apps.client.model.GenericResourceApiServiceinformationServiceInformation; + +/** + * Mapper creating SDNC request + * + */ +@Component +public class NetworkTopologyOperationRequestMapper { + + static GeneralTopologyObjectMapper generalTopologyObjectMapper = new GeneralTopologyObjectMapper(); + + public GenericResourceApiNetworkOperationInformation reqMapper(SDNCSvcOperation svcOperation, + SDNCSvcAction svcAction, GenericResourceApiRequestActionEnumeration reqAction, L3Network network, ServiceInstance serviceInstance, + Customer customer, RequestContext requestContext, CloudRegion cloudRegion) { + GenericResourceApiNetworkOperationInformation req = new GenericResourceApiNetworkOperationInformation(); + String sdncReqId = UUID.randomUUID().toString(); + GenericResourceApiSdncrequestheaderSdncRequestHeader sdncRequestHeader = generalTopologyObjectMapper.buildSdncRequestHeader(svcAction, sdncReqId); + GenericResourceApiRequestinformationRequestInformation requestInformation = generalTopologyObjectMapper.buildGenericResourceApiRequestinformationRequestInformation(sdncReqId, reqAction); + GenericResourceApiServiceinformationServiceInformation serviceInformation = generalTopologyObjectMapper.buildServiceInformation(serviceInstance, requestContext, customer, true); + GenericResourceApiNetworkinformationNetworkInformation networkInformation = generalTopologyObjectMapper.buildNetworkInformation(network); + GenericResourceApiNetworkrequestinputNetworkRequestInput networkRequestInput = buildNetworkRequestInput(network, serviceInstance, cloudRegion); + + req.setRequestInformation(requestInformation); + req.setSdncRequestHeader(sdncRequestHeader); + req.setServiceInformation(serviceInformation); + req.setNetworkInformation(networkInformation); + + if (requestContext.getUserParams() != null) { + for (Map.Entry<String, String> entry : requestContext.getUserParams().entrySet()) { + GenericResourceApiParam networkInputParameters = new GenericResourceApiParam(); + GenericResourceApiParamParam paramItem = new GenericResourceApiParamParam(); + paramItem.setName(entry.getKey()); + paramItem.setValue(entry.getValue()); + networkInputParameters.addParamItem(paramItem); + networkRequestInput.setNetworkInputParameters(networkInputParameters); + } + } + + req.setNetworkRequestInput(networkRequestInput); + return req; + } + /* + * Private helper to build GenericResourceApiNetworkrequestinputNetworkRequestInput + */ + private GenericResourceApiNetworkrequestinputNetworkRequestInput buildNetworkRequestInput(L3Network network, ServiceInstance serviceInstance, CloudRegion cloudRegion){ + GenericResourceApiNetworkrequestinputNetworkRequestInput networkRequestInput = new GenericResourceApiNetworkrequestinputNetworkRequestInput(); + networkRequestInput.setTenant(cloudRegion.getTenantId()); + networkRequestInput.setAicCloudRegion(cloudRegion.getLcpCloudRegionId()); + if (network.getNetworkName() != null && !network.getNetworkName().equals("")) { + networkRequestInput.setNetworkName(network.getNetworkName()); + } + if (serviceInstance.getCollection() != null && serviceInstance.getCollection().getInstanceGroup() != null){ + //set only for network created as part of the collection/instance since 1806 + networkRequestInput.setNetworkInstanceGroupId(serviceInstance.getCollection().getInstanceGroup().getId()); + } + return networkRequestInput; + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/ServiceTopologyOperationMapper.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/ServiceTopologyOperationMapper.java new file mode 100644 index 0000000000..9e29c66029 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/ServiceTopologyOperationMapper.java @@ -0,0 +1,79 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.sdnc.mapper; + +import java.util.Map; +import java.util.UUID; + +import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.client.sdnc.beans.SDNCSvcAction; +import org.onap.so.client.sdnc.beans.SDNCSvcOperation; +import org.springframework.stereotype.Component; + +import org.onap.sdnc.apps.client.model.GenericResourceApiParam; +import org.onap.sdnc.apps.client.model.GenericResourceApiParamParam; +import org.onap.sdnc.apps.client.model.GenericResourceApiRequestActionEnumeration; +import org.onap.sdnc.apps.client.model.GenericResourceApiRequestinformationRequestInformation; +import org.onap.sdnc.apps.client.model.GenericResourceApiSdncrequestheaderSdncRequestHeader; +import org.onap.sdnc.apps.client.model.GenericResourceApiServiceOperationInformation; +import org.onap.sdnc.apps.client.model.GenericResourceApiServiceinformationServiceInformation; +import org.onap.sdnc.apps.client.model.GenericResourceApiServicerequestinputServiceRequestInput; + +@Component +public class ServiceTopologyOperationMapper{ + + static GeneralTopologyObjectMapper generalTopologyObjectMapper = new GeneralTopologyObjectMapper(); + + public GenericResourceApiServiceOperationInformation reqMapper (SDNCSvcOperation svcOperation, + SDNCSvcAction svcAction, GenericResourceApiRequestActionEnumeration resourceAction,ServiceInstance serviceInstance, Customer customer, RequestContext requestContext) { + + String sdncReqId = UUID.randomUUID().toString(); + GenericResourceApiServiceOperationInformation servOpInput = new GenericResourceApiServiceOperationInformation(); + GenericResourceApiSdncrequestheaderSdncRequestHeader sdncRequestHeader = generalTopologyObjectMapper.buildSdncRequestHeader(svcAction, sdncReqId); + GenericResourceApiRequestinformationRequestInformation reqInfo = generalTopologyObjectMapper.buildGenericResourceApiRequestinformationRequestInformation(sdncReqId, resourceAction); + GenericResourceApiServiceinformationServiceInformation servInfo = generalTopologyObjectMapper.buildServiceInformation(serviceInstance, requestContext, customer, true); + GenericResourceApiServicerequestinputServiceRequestInput servReqInfo = new GenericResourceApiServicerequestinputServiceRequestInput(); + + servReqInfo.setServiceInstanceName(serviceInstance.getServiceInstanceId()); + + servOpInput.setSdncRequestHeader(sdncRequestHeader); + servOpInput.setRequestInformation(reqInfo); + servOpInput.setServiceInformation(servInfo); + servOpInput.setServiceRequestInput(servReqInfo); + + if(requestContext.getUserParams()!=null){ + for (Map.Entry<String, String> entry : requestContext.getUserParams().entrySet()) { + GenericResourceApiServicerequestinputServiceRequestInput serviceRequestInput = new GenericResourceApiServicerequestinputServiceRequestInput(); + serviceRequestInput.setServiceInstanceName(serviceInstance.getServiceInstanceId()); + GenericResourceApiParam serviceInputParameters = new GenericResourceApiParam(); + GenericResourceApiParamParam paramItem = new GenericResourceApiParamParam(); + paramItem.setName(entry.getKey()); + paramItem.setValue(entry.getValue()); + serviceInputParameters.addParamItem(paramItem ); + serviceRequestInput.serviceInputParameters(serviceInputParameters); + servOpInput.setServiceRequestInput(serviceRequestInput ); + } + } + return servOpInput; + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/VfModuleTopologyOperationRequestMapper.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/VfModuleTopologyOperationRequestMapper.java new file mode 100644 index 0000000000..30daca14f5 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/VfModuleTopologyOperationRequestMapper.java @@ -0,0 +1,164 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.sdnc.mapper; + +import java.util.Map; +import java.util.UUID; + +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule; +import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.client.sdnc.beans.SDNCSvcAction; +import org.onap.so.client.sdnc.beans.SDNCSvcOperation; +import org.onap.so.logger.MessageEnum; +import org.onap.so.logger.MsoLogger; +import org.springframework.stereotype.Component; + +import org.onap.sdnc.apps.client.model.GenericResourceApiParam; +import org.onap.sdnc.apps.client.model.GenericResourceApiParamParam; +import org.onap.sdnc.apps.client.model.GenericResourceApiRequestActionEnumeration; +import org.onap.sdnc.apps.client.model.GenericResourceApiRequestinformationRequestInformation; +import org.onap.sdnc.apps.client.model.GenericResourceApiSdncrequestheaderSdncRequestHeader; +import org.onap.sdnc.apps.client.model.GenericResourceApiServiceinformationServiceInformation; +import org.onap.sdnc.apps.client.model.GenericResourceApiSvcActionEnumeration; +import org.onap.sdnc.apps.client.model.GenericResourceApiVfModuleOperationInformation; +import org.onap.sdnc.apps.client.model.GenericResourceApiVnfinformationVnfInformation; +import org.onap.sdnc.apps.client.model.GenericResourceApiVfmoduleinformationVfModuleInformation; +import org.onap.sdnc.apps.client.model.GenericResourceApiVfmodulerequestinputVfModuleRequestInput; +import org.onap.sdnc.apps.client.model.GenericResourceApiVfModuleResponseInformation; + +import com.fasterxml.jackson.databind.ObjectMapper; + +@Component +public class VfModuleTopologyOperationRequestMapper { + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, VfModuleTopologyOperationRequestMapper.class); + static GeneralTopologyObjectMapper generalTopologyObjectMapper = new GeneralTopologyObjectMapper(); + + public GenericResourceApiVfModuleOperationInformation reqMapper(SDNCSvcOperation svcOperation, + SDNCSvcAction svcAction, VfModule vfModule, VolumeGroup volumeGroup, GenericVnf vnf, ServiceInstance serviceInstance, + Customer customer, CloudRegion cloudRegion, RequestContext requestContext, String sdncAssignResponse) { + GenericResourceApiVfModuleOperationInformation req = new GenericResourceApiVfModuleOperationInformation(); + + boolean includeModelInformation = false; + + GenericResourceApiRequestActionEnumeration requestAction = GenericResourceApiRequestActionEnumeration.CREATEVFMODULEINSTANCE; + GenericResourceApiSvcActionEnumeration genericResourceApiSvcAction = GenericResourceApiSvcActionEnumeration.ASSIGN; + + if (svcAction.equals(SDNCSvcAction.ACTIVATE)) { + genericResourceApiSvcAction = GenericResourceApiSvcActionEnumeration.ACTIVATE; + requestAction = GenericResourceApiRequestActionEnumeration.CREATEVFMODULEINSTANCE; + includeModelInformation = true; + } else if (svcAction.equals(SDNCSvcAction.ASSIGN)) { + genericResourceApiSvcAction = GenericResourceApiSvcActionEnumeration.ASSIGN; + requestAction = GenericResourceApiRequestActionEnumeration.CREATEVFMODULEINSTANCE; + includeModelInformation = true; + } else if (svcAction.equals(SDNCSvcAction.DEACTIVATE)) { + genericResourceApiSvcAction = GenericResourceApiSvcActionEnumeration.DEACTIVATE; + requestAction = GenericResourceApiRequestActionEnumeration.DELETEVFMODULEINSTANCE; + includeModelInformation = false; + } else if (svcAction.equals(SDNCSvcAction.DELETE)) { + genericResourceApiSvcAction = GenericResourceApiSvcActionEnumeration.DELETE; + requestAction = GenericResourceApiRequestActionEnumeration.DELETEVFMODULEINSTANCE; + includeModelInformation = false; + } else if (svcAction.equals(SDNCSvcAction.UNASSIGN)) { + genericResourceApiSvcAction = GenericResourceApiSvcActionEnumeration.UNASSIGN; + requestAction = GenericResourceApiRequestActionEnumeration.DELETEVFMODULEINSTANCE; + includeModelInformation = false; + } + + String sdncReqId = UUID.randomUUID().toString(); + + GenericResourceApiRequestinformationRequestInformation requestInformation = generalTopologyObjectMapper.buildGenericResourceApiRequestinformationRequestInformation(sdncReqId, + requestAction); + GenericResourceApiServiceinformationServiceInformation serviceInformation = generalTopologyObjectMapper.buildServiceInformation(serviceInstance, requestContext, customer, includeModelInformation); + GenericResourceApiVnfinformationVnfInformation vnfInformation = generalTopologyObjectMapper.buildVnfInformation(vnf, serviceInstance, includeModelInformation); + GenericResourceApiVfmoduleinformationVfModuleInformation vfModuleInformation = generalTopologyObjectMapper.buildVfModuleInformation(vfModule, vnf, serviceInstance, includeModelInformation); + GenericResourceApiVfmodulerequestinputVfModuleRequestInput vfModuleRequestInput = buildVfModuleRequestInput(vfModule, volumeGroup, cloudRegion, requestContext); + GenericResourceApiSdncrequestheaderSdncRequestHeader sdncRequestHeader = buildVfModuleSdncRequestHeader(sdncReqId, genericResourceApiSvcAction); + + req.setRequestInformation(requestInformation); + req.setSdncRequestHeader(sdncRequestHeader); + req.setServiceInformation(serviceInformation); + req.setVnfInformation(vnfInformation); + req.setVfModuleInformation(vfModuleInformation); + req.setVfModuleRequestInput(vfModuleRequestInput); + + return req; + } + + private GenericResourceApiVfmodulerequestinputVfModuleRequestInput buildVfModuleRequestInput(VfModule vfModule, VolumeGroup volumeGroup, CloudRegion cloudRegion, RequestContext requestContext) { + GenericResourceApiVfmodulerequestinputVfModuleRequestInput vfModuleRequestInput = new GenericResourceApiVfmodulerequestinputVfModuleRequestInput(); + if (cloudRegion != null) { + vfModuleRequestInput.setTenant(cloudRegion.getTenantId()); + vfModuleRequestInput.setAicCloudRegion(cloudRegion.getLcpCloudRegionId()); + } + if (vfModule.getVfModuleName() != null && !vfModule.getVfModuleName().equals("")) { + vfModuleRequestInput.setVfModuleName(vfModule.getVfModuleName()); + } + GenericResourceApiParam vfModuleInputParameters = new GenericResourceApiParam(); + + if (requestContext != null && requestContext.getUserParams() != null) { + for (Map.Entry<String, String> entry : requestContext.getUserParams().entrySet()) { + GenericResourceApiParamParam paramItem = new GenericResourceApiParamParam(); + paramItem.setName(entry.getKey()); + paramItem.setValue(entry.getValue()); + vfModuleInputParameters.addParamItem(paramItem); + } + } + + if (volumeGroup != null) { + GenericResourceApiParamParam paramItem = new GenericResourceApiParamParam(); + paramItem.setName("volume-group-id"); + paramItem.setValue(volumeGroup.getVolumeGroupId()); + vfModuleInputParameters.addParamItem(paramItem); + } + vfModuleRequestInput.setVfModuleInputParameters(vfModuleInputParameters); + + return vfModuleRequestInput; + } + + private GenericResourceApiSdncrequestheaderSdncRequestHeader buildVfModuleSdncRequestHeader(String sdncReqId, GenericResourceApiSvcActionEnumeration svcAction) { + GenericResourceApiSdncrequestheaderSdncRequestHeader sdncRequestHeader = new GenericResourceApiSdncrequestheaderSdncRequestHeader(); + + sdncRequestHeader.setSvcRequestId(sdncReqId); + sdncRequestHeader.setSvcAction(svcAction); + + return sdncRequestHeader; + } + + public String buildObjectPath(String sdncAssignResponse) { + String objectPath = null; + if (sdncAssignResponse != null) { + ObjectMapper mapper = new ObjectMapper(); + try { + GenericResourceApiVfModuleResponseInformation assignResponseInfo = mapper.readValue(sdncAssignResponse, GenericResourceApiVfModuleResponseInformation.class); + objectPath = assignResponseInfo.getVfModuleResponseInformation().getObjectPath(); + } catch (Exception e) { + msoLogger.error(MessageEnum.RA_RESPONSE_FROM_SDNC, e.getMessage(), "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e.getMessage()); + } + } + return objectPath; + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/VnfTopologyOperationRequestMapper.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/VnfTopologyOperationRequestMapper.java new file mode 100644 index 0000000000..f9a85abc36 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sdnc/mapper/VnfTopologyOperationRequestMapper.java @@ -0,0 +1,138 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.sdnc.mapper; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.apache.commons.lang.StringUtils; +import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion; +import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer; +import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf; +import org.onap.so.bpmn.servicedecomposition.bbobjects.InstanceGroup; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.generalobjects.License; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoInstanceGroup; +import org.onap.so.client.sdnc.beans.SDNCSvcAction; +import org.onap.so.client.sdnc.beans.SDNCSvcOperation; +import org.springframework.stereotype.Component; + +import org.onap.sdnc.apps.client.model.GenericResourceApiParam; +import org.onap.sdnc.apps.client.model.GenericResourceApiParamParam; +import org.onap.sdnc.apps.client.model.GenericResourceApiRequestActionEnumeration; +import org.onap.sdnc.apps.client.model.GenericResourceApiRequestinformationRequestInformation; +import org.onap.sdnc.apps.client.model.GenericResourceApiSdncrequestheaderSdncRequestHeader; +import org.onap.sdnc.apps.client.model.GenericResourceApiServiceinformationServiceInformation; +import org.onap.sdnc.apps.client.model.GenericResourceApiVnfOperationInformation; +import org.onap.sdnc.apps.client.model.GenericResourceApiVnfinformationVnfInformation; +import org.onap.sdnc.apps.client.model.GenericResourceApiVnfrequestinputVnfRequestInput; +import org.onap.sdnc.apps.client.model.GenericResourceApiVnfrequestinputVnfrequestinputVnfNetworkInstanceGroupIds; + +@Component +public class VnfTopologyOperationRequestMapper { + + static GeneralTopologyObjectMapper generalTopologyObjectMapper = new GeneralTopologyObjectMapper(); + + public GenericResourceApiVnfOperationInformation reqMapper(SDNCSvcOperation svcOperation, SDNCSvcAction svcAction, + GenericResourceApiRequestActionEnumeration requestAction, GenericVnf vnf, ServiceInstance serviceInstance, + Customer customer, CloudRegion cloudRegion, RequestContext requestContext, boolean homing) { + String sdncReqId = UUID.randomUUID().toString(); + GenericResourceApiVnfOperationInformation req = new GenericResourceApiVnfOperationInformation(); + GenericResourceApiSdncrequestheaderSdncRequestHeader sdncRequestHeader = generalTopologyObjectMapper + .buildSdncRequestHeader(svcAction, sdncReqId); + GenericResourceApiRequestinformationRequestInformation requestInformation = generalTopologyObjectMapper + .buildGenericResourceApiRequestinformationRequestInformation(sdncReqId, requestAction); + GenericResourceApiServiceinformationServiceInformation serviceInformation = generalTopologyObjectMapper + .buildServiceInformation(serviceInstance, requestContext, customer, true); + GenericResourceApiVnfinformationVnfInformation vnfInformation = generalTopologyObjectMapper + .buildVnfInformation(vnf, serviceInstance, true); + GenericResourceApiVnfrequestinputVnfRequestInput vnfRequestInput = new GenericResourceApiVnfrequestinputVnfRequestInput(); + + vnfRequestInput.setTenant(cloudRegion.getTenantId()); + vnfRequestInput.setAicCloudRegion(cloudRegion.getLcpCloudRegionId()); + + if (StringUtils.isNotBlank(vnf.getVnfName())) { + vnfRequestInput.setVnfName(vnf.getVnfName()); + } + + req.setRequestInformation(requestInformation); + req.setSdncRequestHeader(sdncRequestHeader); + req.setServiceInformation(serviceInformation); + req.setVnfInformation(vnfInformation); + + GenericResourceApiParam vnfInputParameters = new GenericResourceApiParam(); + if (requestContext.getUserParams() != null) { + for (Map.Entry<String, String> entry : requestContext.getUserParams().entrySet()) { + GenericResourceApiParamParam paramItem = new GenericResourceApiParamParam(); + paramItem.setName(entry.getKey()); + paramItem.setValue(entry.getValue()); + vnfInputParameters.addParamItem(paramItem); + vnfRequestInput.setVnfInputParameters(vnfInputParameters); + } + } + if (vnf.getCloudParams() != null) { + for (Map.Entry<String, String> entry : vnf.getCloudParams().entrySet()) { + GenericResourceApiParamParam paramItem = new GenericResourceApiParamParam(); + paramItem.setName(entry.getKey()); + paramItem.setValue(entry.getValue()); + vnfInputParameters.addParamItem(paramItem); + } + } + if (homing) { + License license = vnf.getLicense(); + if (license != null) { + if(license.getEntitlementPoolUuids() != null && !license.getEntitlementPoolUuids().isEmpty()) { + String entitlementPoolUuid = license.getEntitlementPoolUuids().get(0); + GenericResourceApiParamParam paramItem = new GenericResourceApiParamParam(); + paramItem.setName("entitlement_assignment_group_uuid"); + paramItem.setValue(entitlementPoolUuid); + vnfInputParameters.addParamItem(paramItem); + } + if (license.getLicenseKeyGroupUuids() != null && !license.getLicenseKeyGroupUuids().isEmpty()) { + String licenseKeyGroupUuid = license.getLicenseKeyGroupUuids().get(0); + GenericResourceApiParamParam paramItem2 = new GenericResourceApiParamParam(); + paramItem2.setName("license_assignment_group_uuid"); + paramItem2.setValue(licenseKeyGroupUuid); + vnfInputParameters.addParamItem(paramItem2); + } + } + } + List<InstanceGroup> instanceGroups = vnf.getInstanceGroups(); + List<GenericResourceApiVnfrequestinputVnfrequestinputVnfNetworkInstanceGroupIds> networkInstanceGroupIdList = new ArrayList<GenericResourceApiVnfrequestinputVnfrequestinputVnfNetworkInstanceGroupIds>(); + + for (InstanceGroup instanceGroup : instanceGroups) { + if (ModelInfoInstanceGroup.TYPE_NETWORK_INSTANCE_GROUP + .equalsIgnoreCase(instanceGroup.getModelInfoInstanceGroup().getType())) { + GenericResourceApiVnfrequestinputVnfrequestinputVnfNetworkInstanceGroupIds instanceGroupId = new GenericResourceApiVnfrequestinputVnfrequestinputVnfNetworkInstanceGroupIds(); + instanceGroupId.setVnfNetworkInstanceGroupId(instanceGroup.getId()); + networkInstanceGroupIdList.add(instanceGroupId); + } + } + + vnfRequestInput.setVnfNetworkInstanceGroupIds(networkInstanceGroupIdList); + vnfRequestInput.setVnfInputParameters(vnfInputParameters); + req.setVnfRequestInput(vnfRequestInput); + return req; + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/SniroClient.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/SniroClient.java new file mode 100644 index 0000000000..979b9e5e80 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/SniroClient.java @@ -0,0 +1,115 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.sniro; + +import java.util.LinkedHashMap; + +import org.camunda.bpm.engine.delegate.BpmnError; +import org.onap.so.bpmn.core.UrnPropertiesReader; +import org.onap.so.client.exception.BadResponseException; +import org.onap.so.client.sdnc.BaseClient; +import org.onap.so.client.sniro.beans.ManagerProperties; +import org.onap.so.client.sniro.beans.SniroConductorRequest; +import org.onap.so.client.sniro.beans.SniroManagerRequest; +import org.onap.so.logger.MsoLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; + +import com.fasterxml.jackson.core.JsonProcessingException; + + +@Component +public class SniroClient { + + private static final MsoLogger log = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, SniroClient.class); + + @Autowired + private ManagerProperties managerProperties; + + @Autowired + private SniroValidator validator; + + + /** + * Makes a rest call to sniro manager to perform homing and licensing for a + * list of demands + * + * @param homingRequest + * @return + * @throws JsonProcessingException + * @throws BpmnError + */ + public void postDemands(SniroManagerRequest homingRequest) throws BadResponseException, JsonProcessingException{ + log.trace("Started Sniro Client Post Demands"); + String url = managerProperties.getHost() + managerProperties.getUri().get("v2"); + log.debug("Post demands url: " + url); + log.debug("Post demands payload: " + homingRequest.toJsonString()); + + HttpHeaders header = new HttpHeaders(); + header.setContentType(MediaType.APPLICATION_JSON); + header.set("Authorization", managerProperties.getHeaders().get("auth")); + header.set("X-patchVersion", managerProperties.getHeaders().get("patchVersion")); + header.set("X-minorVersion", managerProperties.getHeaders().get("minorVersion")); + header.set("X-latestVersion", managerProperties.getHeaders().get("latestVersion")); + BaseClient<String, LinkedHashMap<?, ?>> baseClient = new BaseClient<>(); + + baseClient.setTargetUrl(url); + baseClient.setHttpHeader(header); + + LinkedHashMap<?, ?> response = baseClient.post(homingRequest.toJsonString()); + validator.validateDemandsResponse(response); + log.trace("Completed Sniro Client Post Demands"); + } + + /** + * Makes a rest call to sniro conductor to notify them of successful or unsuccessful vnf + * creation for previously homed resources + * + * TODO Temporarily being used in groovy therefore can not utilize autowire. Once java "release" + * subflow is developed it will be refactored to use autowire. + * + * @param releaseRequest + * @return + * @throws BadResponseException + */ + public void postRelease(SniroConductorRequest releaseRequest) throws BadResponseException { + log.trace("Started Sniro Client Post Release"); + String url = UrnPropertiesReader.getVariable("sniro.conductor.host") + UrnPropertiesReader.getVariable("sniro.conductor.uri"); + log.debug("Post release url: " + url); + log.debug("Post release payload: " + releaseRequest.toJsonString()); + + HttpHeaders header = new HttpHeaders(); + header.setContentType(MediaType.APPLICATION_JSON); + header.set("Authorization", UrnPropertiesReader.getVariable("sniro.conductor.headers.auth")); + BaseClient<String, LinkedHashMap<?, ?>> baseClient = new BaseClient<>(); + + baseClient.setTargetUrl(url); + baseClient.setHttpHeader(header); + + LinkedHashMap<?, ?> response = baseClient.post(releaseRequest.toJsonString()); + SniroValidator v = new SniroValidator(); + v.validateReleaseResponse(response); + log.trace("Completed Sniro Client Post Release"); + } + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/SniroValidator.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/SniroValidator.java new file mode 100644 index 0000000000..bad45c87f2 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/SniroValidator.java @@ -0,0 +1,138 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.sniro; + + +import static org.apache.commons.lang.StringUtils.*; + +import java.util.LinkedHashMap; + +import org.json.JSONObject; +import org.onap.so.client.exception.BadResponseException; + +import org.onap.so.logger.MsoLogger; +import org.springframework.stereotype.Component; + + + +@Component +public class SniroValidator { + + private static final MsoLogger log = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, SniroValidator.class); + + /** + * Validates the synchronous homing response from sniro manager + * + * @throws BadResponseException + */ + public void validateDemandsResponse(LinkedHashMap<?, ?> response) throws BadResponseException { + log.debug("Validating Sniro Managers synchronous response"); + if(!response.isEmpty()){ + JSONObject jsonResponse = new JSONObject(response); + if(jsonResponse.has("requestStatus")){ + String status = jsonResponse.getString("requestStatus"); + if(status.equals("accepted")){ + log.debug("Sniro Managers synchronous response indicates accepted"); + }else{ + String message = jsonResponse.getString("statusMessage"); + if(isNotBlank(message)){ + log.debug("Sniro Managers response indicates failed: " + message); + }else{ + log.debug("Sniro Managers response indicates failed: no status message provided"); + message = "error message not provided"; + } + throw new BadResponseException("Sniro Managers synchronous response indicates failed: " + message); + } + }else{ + log.debug("Sniro Managers synchronous response does not contain: request status"); + throw new BadResponseException("Sniro Managers synchronous response does not contain: request status"); + } + }else{ + log.debug("Sniro Managers synchronous response is empty"); + throw new BadResponseException("Sniro Managers synchronous response i is empty"); + } + } + + /** + * Validates the asynchronous/callback response from sniro manager which + * contains the homing and licensing solutions + * + * @throws BadResponseException + */ + public static void validateSolution(String response) throws BadResponseException{ + log.debug("Validating Sniro Managers asynchronous callback response"); + if(isNotBlank(response)) { + JSONObject jsonResponse = new JSONObject(response); + if(!jsonResponse.has("serviceException")){ + log.debug("Sniro Managers asynchronous response is valid"); + }else{ + String message = jsonResponse.getJSONObject("serviceException").getString("text"); + if(isNotBlank(message)){ + log.debug("Sniro Managers response contains a service exception: " + message); + }else{ + log.debug("Sniro Managers response contains a service exception: no service exception text provided"); + message = "error message not provided"; + } + throw new BadResponseException("Sniro Managers asynchronous response contains a service exception: " + message); + } + }else{ + log.debug("Sniro Managers asynchronous response is empty"); + throw new BadResponseException("Sniro Managers asynchronous response is empty"); + } + } + + + /** + * Validates the release response from sniro conductor + * + * @throws BadResponseException + */ + public void validateReleaseResponse(LinkedHashMap<?, ?> response) throws BadResponseException { + log.debug("Validating Sniro Conductors response"); + if(!response.isEmpty()){ + String status = (String) response.get("status"); + if(isNotBlank(status)){ + if(status.equals("success")){ + log.debug("Sniro Conductors synchronous response indicates success"); + }else{ + String message = (String) response.get("message"); + if(isNotBlank(message)){ + log.debug("Sniro Conductors response indicates failed: " + message); + }else{ + log.debug("Sniro Conductors response indicates failed: error message not provided"); + message = "error message not provided"; + } + throw new BadResponseException("Sniro Conductors synchronous response indicates failed: " + message); + } + }else{ + log.debug("Sniro Managers Conductors response does not contain: status"); + throw new BadResponseException("Sniro Conductors synchronous response does not contain: status"); + } + }else{ + log.debug("Sniro Conductors response is empty"); + throw new BadResponseException("Sniro Conductors response is empty"); + } + + } + + + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/ConductorProperties.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/ConductorProperties.java new file mode 100644 index 0000000000..6e60bfa293 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/ConductorProperties.java @@ -0,0 +1,62 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.sniro.beans; + +import java.util.Map; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConfigurationProperties(prefix = "sniro.conductor") +public class ConductorProperties { + + private String host; + private String uri; + + private Map<String, String> headers; + + + public String getHost() { + return host; + } + public void setHost(String host) { + this.host = host; + } + public String getUri() { + return uri; + } + public void setUri(String uri) { + this.uri = uri; + } + public Map<String, String> getHeaders() { + return headers; + } + public void setHeaders(Map<String, String> headers) { + this.headers = headers; + } + + + + + + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/ManagerProperties.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/ManagerProperties.java new file mode 100644 index 0000000000..0070f2fe04 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/ManagerProperties.java @@ -0,0 +1,59 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.sniro.beans; + +import java.util.Map; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConfigurationProperties(prefix = "sniro.manager") +public class ManagerProperties { + + private String host; + private Map<String, String> uri; + private Map<String, String> headers; + + + public String getHost() { + return host; + } + public void setHost(String host) { + this.host = host; + } + public Map<String, String> getUri() { + return uri; + } + public void setUri(Map<String, String> uri) { + this.uri = uri; + } + public Map<String, String> getHeaders() { + return headers; + } + public void setHeaders(Map<String, String> headers) { + this.headers = headers; + } + + + + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/RequestInfo.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/RequestInfo.java new file mode 100644 index 0000000000..0d7e44224e --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/RequestInfo.java @@ -0,0 +1,57 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.sniro.beans; + +import java.io.Serializable; + + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; + + +@JsonRootName("requestInfo") +public class RequestInfo implements Serializable{ + + private static final long serialVersionUID = -759180997599143791L; + + @JsonProperty("transactionId") + String transactionId; + @JsonProperty("requestId") + String requestId; + + public String getTransactionId(){ + return transactionId; + } + + public void setTransactionId(String transactionId){ + this.transactionId = transactionId; + } + + public String getRequestId(){ + return requestId; + } + + public void setRequestId(String requestId){ + this.requestId = requestId; + } + + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/Resource.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/Resource.java new file mode 100644 index 0000000000..8441a01072 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/Resource.java @@ -0,0 +1,55 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.sniro.beans; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class Resource implements Serializable{ + + private static final long serialVersionUID = 5949861520571440421L; + + @JsonProperty("service-resource-id") + private String serviceResourceId; + @JsonProperty("status") + private String status; + + + public String getServiceResourceId(){ + return serviceResourceId; + } + + public void setServiceResourceId(String serviceResourceId){ + this.serviceResourceId = serviceResourceId; + } + + public String getStatus(){ + return status; + } + + public void setStatus(String status){ + this.status = status; + } + + + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/SniroConductorRequest.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/SniroConductorRequest.java new file mode 100644 index 0000000000..bc8e27ce86 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/SniroConductorRequest.java @@ -0,0 +1,65 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.sniro.beans; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import org.onap.so.logger.MsoLogger; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectWriter; + + +public class SniroConductorRequest implements Serializable{ + + private static final long serialVersionUID = 1906052095861777655L; + private static final MsoLogger log = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, SniroConductorRequest.class); + + @JsonProperty("release-locks") + private List<Resource> resources = new ArrayList<Resource>(); + + + public List<Resource> getResources(){ + return resources; + } + + @JsonInclude(Include.NON_NULL) + public String toJsonString(){ + String json = ""; + ObjectMapper mapper = new ObjectMapper(); + mapper.setSerializationInclusion(Include.NON_NULL); + ObjectWriter ow = mapper.writer().withDefaultPrettyPrinter(); + try{ + json = ow.writeValueAsString(this); + }catch (Exception e){ + log.error("Unable to convert SniroConductorRequest to string", e); + } + return json; + } + + + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/SniroManagerRequest.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/SniroManagerRequest.java new file mode 100644 index 0000000000..19b752ffd1 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/sniro/beans/SniroManagerRequest.java @@ -0,0 +1,95 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.so.client.sniro.beans; + +import java.io.Serializable; + +import org.onap.so.logger.MsoLogger; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRawValue; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectWriter; + + +public class SniroManagerRequest implements Serializable{ + + private static final long serialVersionUID = -1541132882892163132L; + private static final MsoLogger log = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, SniroManagerRequest.class); + + @JsonRawValue + @JsonProperty("requestInfo") + private String requestInformation; + @JsonRawValue + @JsonProperty("serviceInfo") + private String serviceInformation; + @JsonRawValue + @JsonProperty("placementInfo") + private String placementInformation; + @JsonRawValue + @JsonProperty("licenseInfo") + private String licenseInformation; + + + public String getRequestInformation() { + return requestInformation; + } + public void setRequestInformation(String requestInformation) { + this.requestInformation = requestInformation; + } + public String getServiceInformation() { + return serviceInformation; + } + public void setServiceInformation(String serviceInformation) { + this.serviceInformation = serviceInformation; + } + public String getPlacementInformation() { + return placementInformation; + } + public void setPlacementInformation(String placementInformation) { + this.placementInformation = placementInformation; + } + public String getLicenseInformation() { + return licenseInformation; + } + public void setLicenseInformation(String licenseInformation) { + this.licenseInformation = licenseInformation; + } + + + @JsonInclude(Include.NON_NULL) + public String toJsonString(){ + String json = ""; + ObjectMapper mapper = new ObjectMapper(); + mapper.setSerializationInclusion(Include.NON_NULL); + ObjectWriter ow = mapper.writer().withDefaultPrettyPrinter(); + try{ + json = ow.writeValueAsString(this); + }catch (Exception e){ + log.error("Unable to convert SniroManagerRequest to string", e); + } + return json.replaceAll("\\\\", ""); + } + + +} |