2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
 
   6  * ================================================================================
 
   7  * Licensed under the Apache License, Version 2.0 (the "License");
 
   8  * you may not use this file except in compliance with the License.
 
   9  * You may obtain a copy of the License at
 
  11  *      http://www.apache.org/licenses/LICENSE-2.0
 
  13  * Unless required by applicable law or agreed to in writing, software
 
  14  * distributed under the License is distributed on an "AS IS" BASIS,
 
  15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  16  * See the License for the specific language governing permissions and
 
  17  * limitations under the License.
 
  18  * ============LICENSE_END=========================================================
 
  21 package org.onap.so.client.adapter.network.mapper;
 
  23 import java.io.UnsupportedEncodingException;
 
  24 import java.util.ArrayList;
 
  25 import java.util.List;
 
  27 import java.util.UUID;
 
  29 import org.modelmapper.ModelMapper;
 
  30 import org.modelmapper.PropertyMap;
 
  31 import org.onap.so.adapters.nwrest.ContrailNetwork;
 
  32 import org.onap.so.adapters.nwrest.CreateNetworkRequest;
 
  33 import org.onap.so.adapters.nwrest.CreateNetworkResponse;
 
  34 import org.onap.so.adapters.nwrest.DeleteNetworkRequest;
 
  35 import org.onap.so.adapters.nwrest.ProviderVlanNetwork;
 
  36 import org.onap.so.adapters.nwrest.RollbackNetworkRequest;
 
  37 import org.onap.so.adapters.nwrest.UpdateNetworkRequest;
 
  38 import org.onap.so.bpmn.core.UrnPropertiesReader;
 
  39 import org.onap.so.bpmn.servicedecomposition.bbobjects.*;
 
  40 import org.onap.so.bpmn.servicedecomposition.generalobjects.OrchestrationContext;
 
  41 import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext;
 
  42 import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoNetwork;
 
  43 import org.onap.so.entity.MsoRequest;
 
  44 import org.onap.so.openstack.beans.NetworkRollback;
 
  45 import org.onap.so.openstack.beans.RouteTarget;
 
  46 import org.onap.so.openstack.beans.Subnet;
 
  47 import org.springframework.stereotype.Component;
 
  48 import org.springframework.web.util.UriUtils;
 
  51 public class NetworkAdapterObjectMapper {
 
  52         private static final ModelMapper modelMapper = new ModelMapper();
 
  53         private static String FORWARD_SLASH = "/";
 
  55         public CreateNetworkRequest createNetworkRequestMapper(RequestContext requestContext, CloudRegion cloudRegion, OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, L3Network l3Network, Map<String, String> userInput, String cloudRegionPo, Customer customer) throws UnsupportedEncodingException {
 
  56                 CreateNetworkRequest createNetworkRequest = new CreateNetworkRequest();
 
  58                 //set cloudSiteId as determined for cloud region PO instead of cloudRegion.getLcpCloudRegionId()
 
  59                 createNetworkRequest.setCloudSiteId(cloudRegionPo);
 
  60                 createNetworkRequest.setTenantId(cloudRegion.getTenantId());
 
  61                 createNetworkRequest.setNetworkId(l3Network.getNetworkId());
 
  62                 createNetworkRequest.setNetworkName(l3Network.getNetworkName());
 
  63                 //TODO fields not available
 
  64                 createNetworkRequest.setNetworkType(l3Network.getNetworkType());
 
  65                 //createNetworkRequest.setNetworkTypeVersion(serviceInstance.getModelInfoServiceInstance().getModelVersion());
 
  66                 ModelInfoNetwork modelInfoNetwork  = l3Network.getModelInfoNetwork();
 
  67                 if (modelInfoNetwork != null){
 
  68                         createNetworkRequest.setModelCustomizationUuid(modelInfoNetwork.getModelCustomizationUUID());
 
  71                 //build and set Subnet list
 
  72                 createNetworkRequest.setSubnets(buildOpenstackSubnetList(l3Network));
 
  74                 //build and set provider Vlan Network
 
  75                 ProviderVlanNetwork providerVlanNetwork = buildProviderVlanNetwork(l3Network);
 
  76                 createNetworkRequest.setProviderVlanNetwork(providerVlanNetwork);
 
  78                 //build and set Contrail Network
 
  79                 ContrailNetwork contrailNetwork = buildContrailNetwork(l3Network, customer);
 
  80                 createNetworkRequest.setContrailNetwork(contrailNetwork);
 
  82                 //set Network Parameters from VID request
 
  83                 createNetworkRequest.setNetworkParams(userInput);
 
  85                 createNetworkRequest = setFlowFlags(createNetworkRequest, orchestrationContext);
 
  87                 createNetworkRequest.setMsoRequest(createMsoRequest(requestContext, serviceInstance));
 
  89                 String messageId = getRandomUuid();
 
  90                 createNetworkRequest.setMessageId(messageId);
 
  91                 //TODO clarify callback URL build process
 
  92                 //createNetworkRequest.setNotificationUrl(createCallbackUrl("NetworkAResponse", messageId));
 
  94                 return createNetworkRequest;
 
  97         public DeleteNetworkRequest deleteNetworkRequestMapper(RequestContext requestContext, CloudRegion cloudRegion, ServiceInstance serviceInstance, L3Network l3Network) throws UnsupportedEncodingException {
 
  98                 DeleteNetworkRequest deleteNetworkRequest = new DeleteNetworkRequest();
 
 100                 deleteNetworkRequest.setCloudSiteId(cloudRegion.getLcpCloudRegionId());
 
 102                 String messageId = getRandomUuid();
 
 103                 deleteNetworkRequest.setMessageId(messageId);
 
 105                 ModelInfoNetwork modelInfoNetwork  = l3Network.getModelInfoNetwork();
 
 106                 if (modelInfoNetwork != null){
 
 107                         deleteNetworkRequest.setModelCustomizationUuid(modelInfoNetwork.getModelCustomizationUUID());
 
 110                 deleteNetworkRequest.setMsoRequest(createMsoRequest(requestContext, serviceInstance));
 
 111                 deleteNetworkRequest.setNetworkId(l3Network.getNetworkId());
 
 112                 deleteNetworkRequest.setNetworkStackId(l3Network.getHeatStackId());
 
 113                 deleteNetworkRequest.setNetworkType(l3Network.getNetworkType());
 
 114                 deleteNetworkRequest.setSkipAAI(true);
 
 115                 deleteNetworkRequest.setTenantId(cloudRegion.getTenantId());
 
 117                 return deleteNetworkRequest;
 
 121          * Access method to build Rollback Network Request
 
 123          * @throws UnsupportedEncodingException
 
 125         public RollbackNetworkRequest createNetworkRollbackRequestMapper(RequestContext requestContext, CloudRegion cloudRegion, OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, L3Network l3Network, Map<String, String> userInput, String cloudRegionPo, CreateNetworkResponse createNetworkResponse) throws UnsupportedEncodingException {
 
 126                 RollbackNetworkRequest rollbackNetworkRequest = new RollbackNetworkRequest();
 
 128                 rollbackNetworkRequest = setCommonRollbackRequestFields(rollbackNetworkRequest, requestContext);
 
 130                 NetworkRollback networkRollback = buildNetworkRollback(l3Network, cloudRegion, cloudRegionPo, createNetworkResponse);
 
 131                 rollbackNetworkRequest.setNetworkRollback(networkRollback);
 
 133                 return rollbackNetworkRequest;
 
 136         public UpdateNetworkRequest createNetworkUpdateRequestMapper(RequestContext requestContext, CloudRegion cloudRegion, OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, L3Network l3Network, Map<String, String> userInput, Customer customer) throws UnsupportedEncodingException {
 
 137                 UpdateNetworkRequest updateNetworkRequest = new UpdateNetworkRequest();
 
 139                 updateNetworkRequest.setCloudSiteId(cloudRegion.getLcpCloudRegionId());
 
 140                 updateNetworkRequest.setTenantId(cloudRegion.getTenantId());
 
 141                 updateNetworkRequest.setNetworkId(l3Network.getNetworkId());
 
 142                 updateNetworkRequest.setNetworkStackId(l3Network.getHeatStackId());
 
 143                 updateNetworkRequest.setNetworkName(l3Network.getNetworkName());
 
 144                 updateNetworkRequest.setNetworkType(l3Network.getModelInfoNetwork().getNetworkType());
 
 145                 updateNetworkRequest.setNetworkTypeVersion(l3Network.getModelInfoNetwork().getModelVersion());
 
 146                 updateNetworkRequest.setModelCustomizationUuid(l3Network.getModelInfoNetwork().getModelCustomizationUUID());
 
 147                 updateNetworkRequest.setSubnets(buildOpenstackSubnetList(l3Network));
 
 148                 updateNetworkRequest.setProviderVlanNetwork(buildProviderVlanNetwork(l3Network));
 
 149                 updateNetworkRequest.setContrailNetwork(buildContrailNetwork(l3Network, customer));
 
 150                 updateNetworkRequest.setNetworkParams(userInput);
 
 151                 updateNetworkRequest.setMsoRequest(createMsoRequest(requestContext, serviceInstance));
 
 153                 setFlowFlags(updateNetworkRequest, orchestrationContext);
 
 155                 String messageId = getRandomUuid();
 
 156                 updateNetworkRequest.setMessageId(messageId);
 
 157                 updateNetworkRequest.setNotificationUrl(createCallbackUrl("NetworkAResponse", messageId));
 
 159                 return updateNetworkRequest;
 
 162         private RollbackNetworkRequest setCommonRollbackRequestFields(RollbackNetworkRequest request,RequestContext requestContext){
 
 163                 //TODO confirm flag value
 
 164                 request.setSkipAAI(true);
 
 165                 request.setMessageId(requestContext.getMsoRequestId());
 
 166                 //TODO clarify callback URL build process. This will also set SYNC flag
 
 167                 //request.setNotificationUrl(createCallbackUrl("NetworkAResponse", messageId));
 
 171         private NetworkRollback buildNetworkRollback(L3Network l3Network, CloudRegion cloudRegion, String cloudRegionPo, CreateNetworkResponse createNetworkResponse){
 
 172                 NetworkRollback networkRollback = new NetworkRollback();
 
 173                 networkRollback.setNetworkId(l3Network.getNetworkId());
 
 174                 networkRollback.setNeutronNetworkId(createNetworkResponse.getMessageId());
 
 175                 networkRollback.setNetworkStackId(createNetworkResponse.getNetworkStackId());
 
 176                 networkRollback.setTenantId(cloudRegion.getTenantId());
 
 177                 networkRollback.setCloudId(cloudRegionPo);
 
 178                 networkRollback.setNetworkType(l3Network.getNetworkType());
 
 179                 ModelInfoNetwork modelInfoNetwork  = l3Network.getModelInfoNetwork();
 
 180                 if (modelInfoNetwork != null){
 
 181                         networkRollback.setModelCustomizationUuid(modelInfoNetwork.getModelCustomizationUUID());
 
 183                 //rollback will only be called when network was actually created
 
 184                 networkRollback.setNetworkCreated(createNetworkResponse.getNetworkCreated());
 
 185                 //TODO confirm below not required for create rollback
 
 190                 return networkRollback;
 
 193         public MsoRequest createMsoRequest(RequestContext requestContext, ServiceInstance serviceInstance) {
 
 194                 MsoRequest msoRequest = new MsoRequest();
 
 195                 msoRequest.setRequestId(requestContext.getMsoRequestId());
 
 196                 msoRequest.setServiceInstanceId(serviceInstance.getServiceInstanceId());
 
 200         protected String getRandomUuid() {
 
 201                 return UUID.randomUUID().toString();
 
 204         protected String createCallbackUrl(String messageType, String correlator) throws UnsupportedEncodingException {
 
 205                 String endpoint = this.getEndpoint();
 
 207                 while (endpoint.endsWith("/")) {
 
 208                         endpoint = endpoint.substring(0, endpoint.length()-1);
 
 210                 return endpoint + "/" + UriUtils.encodePathSegment(messageType, "UTF-8") + "/" + UriUtils.encodePathSegment(correlator, "UTF-8");
 
 213         protected String getEndpoint() {
 
 214                 return UrnPropertiesReader.getVariable("mso.workflow.message.endpoint");
 
 217          * Use BB L3Network object to build subnets list of type org.onap.so.openstack.beans.Subnet
 
 219          * @return List<org.onap.so.openstack.beans.Subnet>
 
 221         private List<Subnet> buildOpenstackSubnetList(L3Network l3Network){
 
 223                 List<org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet> subnets = l3Network.getSubnets();
 
 224                 List<org.onap.so.openstack.beans.Subnet> subnetList = new ArrayList<org.onap.so.openstack.beans.Subnet>();
 
 225                 //create mapper from onap Subnet to openstack bean Subnet
 
 226                 if(modelMapper.getTypeMap(org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet.class, org.onap.so.openstack.beans.Subnet.class) == null) {
 
 227                         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>() {
 
 228                                   protected void configure() {
 
 229                                     map().setSubnetName(source.getSubnetName());
 
 230                                     map(source.getSubnetId(), destination.getSubnetId());
 
 231                                     map(source.getNeutronSubnetId(), destination.getNeutronId());
 
 232                                     map(source.getGatewayAddress(), destination.getGatewayIp());
 
 233                                     map(source.getIpVersion(), destination.getIpVersion());
 
 234                                     map(source.isDhcpEnabled(), destination.getEnableDHCP());
 
 237                         modelMapper.addMappings(personMap);
 
 240                 for (org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet subnet : subnets) {
 
 241                         org.onap.so.openstack.beans.Subnet openstackSubnet = modelMapper.map(subnet, org.onap.so.openstack.beans.Subnet.class);
 
 243                         if (subnet.getNetworkStartAddress() != null && subnet.getCidrMask() != null)
 
 244                                 openstackSubnet.setCidr(subnet.getNetworkStartAddress().concat(FORWARD_SLASH).concat(subnet.getCidrMask()));
 
 245                         List<org.onap.so.bpmn.servicedecomposition.bbobjects.HostRoute> hostRouteList = subnet.getHostRoutes();
 
 246                         List<org.onap.so.openstack.beans.HostRoute> openstackHostRouteList = new ArrayList<>();
 
 247                         org.onap.so.openstack.beans.HostRoute openstackHostRoute = new org.onap.so.openstack.beans.HostRoute();
 
 248                         //TODO only 2 fields available on openstack object. Confirm it is sufficient or add as needed
 
 249                         for (org.onap.so.bpmn.servicedecomposition.bbobjects.HostRoute hostRoute : hostRouteList) {
 
 250                                 openstackHostRoute.setNextHop(hostRoute.getNextHop());
 
 251                                 openstackHostRoute.setPrefix(hostRoute.getRoutePrefix());
 
 252                                 //add host route to the list
 
 253                                 openstackHostRouteList.add(openstackHostRoute);
 
 255                         openstackSubnet.setHostRoutes(openstackHostRouteList);
 
 256                         //add subnet to the list
 
 257                         subnetList.add(openstackSubnet);
 
 262         private ProviderVlanNetwork buildProviderVlanNetwork(L3Network l3Network){
 
 263                 ProviderVlanNetwork providerVlanNetwork = new ProviderVlanNetwork();
 
 264                 providerVlanNetwork.setPhysicalNetworkName(l3Network.getPhysicalNetworkName());
 
 265                 List<Integer> vlans = new ArrayList<Integer>();
 
 266                 List<org.onap.so.bpmn.servicedecomposition.bbobjects.SegmentationAssignment> segmentationAssignments = l3Network.getSegmentationAssignments();
 
 267                 for (org.onap.so.bpmn.servicedecomposition.bbobjects.SegmentationAssignment assignment : segmentationAssignments) {
 
 268                         vlans.add(Integer.valueOf(assignment.getSegmentationId()));
 
 270                 providerVlanNetwork.setVlans(vlans);
 
 271                 return providerVlanNetwork;
 
 274         private ContrailNetwork buildContrailNetwork(L3Network l3Network, Customer customer){
 
 275                 ContrailNetwork contrailNetwork = new ContrailNetwork();
 
 276                 contrailNetwork.setExternal(Boolean.toString(l3Network.isExternalNetwork()));
 
 277                 contrailNetwork.setShared(Boolean.toString(l3Network.isSharedNetwork()));
 
 278                 contrailNetwork.setPolicyFqdns(buildPolicyFqdns(l3Network.getNetworkPolicies()));
 
 279                 contrailNetwork.setRouteTableFqdns(buildRouteTableFqdns(l3Network.getContrailNetworkRouteTableReferences()));
 
 281                         contrailNetwork.setRouteTargets(buildRouteTargets(customer.getVpnBindings()));
 
 282                 //PolicyFqdns(policyFqdns); --- is set in getAAINetworkPolicy
 
 283                 //RouteTableFqdns(routeTableFqdns); --- is set in getAAINetworkTableRef
 
 284                 //RouteTargets(routeTargets); --- is set in getAAINetworkVpnBinding
 
 285                 return contrailNetwork;
 
 288         private List<String> buildPolicyFqdns(List<NetworkPolicy> networkPolicies) {
 
 289                 List<String> policyFqdns = new ArrayList<>();
 
 290                 for(NetworkPolicy networkPolicy : networkPolicies) {
 
 291                         policyFqdns.add(networkPolicy.getNetworkPolicyFqdn());
 
 296         private List<String> buildRouteTableFqdns(List<RouteTableReference> contrailNetworkRouteTableReferences) {
 
 297                 List<String> routeTableFqdns = new ArrayList<>();
 
 298                 for(RouteTableReference routeTableReference : contrailNetworkRouteTableReferences) {
 
 299                         routeTableFqdns.add(routeTableReference.getRouteTableReferenceFqdn());
 
 301                 return routeTableFqdns;
 
 304         private List<RouteTarget> buildRouteTargets(List<VpnBinding> vpnBindings) {
 
 305                 if(modelMapper.getTypeMap(org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTarget.class, RouteTarget.class) == null) {
 
 306                         modelMapper.addMappings(new PropertyMap<org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTarget, RouteTarget>() {
 
 308                                 protected void configure() {
 
 309                                         map().setRouteTarget(source.getGlobalRouteTarget());
 
 310                                         map().setRouteTargetRole(source.getRouteTargetRole());
 
 315                 List<RouteTarget> routeTargets = new ArrayList<>();
 
 316                 for(VpnBinding vpnBinding : vpnBindings) {
 
 317                         for(org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTarget routeTarget : vpnBinding.getRouteTargets()) {
 
 318                                 routeTargets.add(modelMapper.map(routeTarget, RouteTarget.class));
 
 324         private CreateNetworkRequest setFlowFlags(CreateNetworkRequest createNetworkRequest, OrchestrationContext orchestrationContext){
 
 325                 //TODO confirm flag value
 
 326                 createNetworkRequest.setSkipAAI(true);
 
 327                 //revert suppressRollabck=TRUE into backout=FALSE and vice versa
 
 328                 createNetworkRequest.setBackout(orchestrationContext.getIsRollbackEnabled());
 
 329                 //TODO confirm value - false by default
 
 330                 createNetworkRequest.setFailIfExists(true);
 
 331                 //NetworkTechnology(NetworkTechnology.NEUTRON); NOOP - default
 
 332                 return createNetworkRequest;
 
 335         private void setFlowFlags(UpdateNetworkRequest updateNetworkRequest, OrchestrationContext orchestrationContext){
 
 336                 updateNetworkRequest.setSkipAAI(true);
 
 337                 //revert suppressRollabck=TRUE into backout=FALSE and vice versa
 
 338                 updateNetworkRequest.setBackout(!Boolean.valueOf(orchestrationContext.getIsRollbackEnabled()));
 
 339                 //NetworkTechnology(NetworkTechnology.NEUTRON); NOOP - default