794314bf8cd24d9f3a4c63f46bf020238d828ea4
[so.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
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
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
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=========================================================
19  */
20
21 package org.onap.so.client.adapter.network.mapper;
22
23 import java.io.UnsupportedEncodingException;
24 import java.util.ArrayList;
25 import java.util.List;
26 import java.util.Map;
27 import java.util.Optional;
28 import java.util.UUID;
29
30 import org.apache.commons.lang3.StringUtils;
31 import org.modelmapper.ModelMapper;
32 import org.modelmapper.PropertyMap;
33 import org.onap.so.adapters.nwrest.ContrailNetwork;
34 import org.onap.so.adapters.nwrest.CreateNetworkRequest;
35 import org.onap.so.adapters.nwrest.CreateNetworkResponse;
36 import org.onap.so.adapters.nwrest.DeleteNetworkRequest;
37 import org.onap.so.adapters.nwrest.NetworkTechnology;
38 import org.onap.so.adapters.nwrest.ProviderVlanNetwork;
39 import org.onap.so.adapters.nwrest.RollbackNetworkRequest;
40 import org.onap.so.adapters.nwrest.UpdateNetworkRequest;
41 import org.onap.so.bpmn.core.UrnPropertiesReader;
42 import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
43 import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer;
44 import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network;
45 import org.onap.so.bpmn.servicedecomposition.bbobjects.NetworkPolicy;
46 import org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTableReference;
47 import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
48 import org.onap.so.bpmn.servicedecomposition.bbobjects.VpnBinding;
49 import org.onap.so.bpmn.servicedecomposition.generalobjects.OrchestrationContext;
50 import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext;
51 import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoNetwork;
52 import org.onap.so.entity.MsoRequest;
53 import org.onap.so.logger.MsoLogger;
54 import org.onap.so.openstack.beans.NetworkRollback;
55 import org.onap.so.openstack.beans.RouteTarget;
56 import org.onap.so.openstack.beans.Subnet;
57 import org.slf4j.Logger;
58 import org.slf4j.LoggerFactory;
59 import org.springframework.stereotype.Component;
60 import org.springframework.web.util.UriUtils;
61
62 @Component
63 public class NetworkAdapterObjectMapper {
64         private static final ModelMapper modelMapper = new ModelMapper();
65         private static String FORWARD_SLASH = "/";
66         private static final Logger logger = LoggerFactory.getLogger(NetworkAdapterObjectMapper.class);
67
68         public CreateNetworkRequest createNetworkRequestMapper(RequestContext requestContext, CloudRegion cloudRegion, OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, L3Network l3Network, Map<String, String> userInput, String cloudRegionPo, Customer customer) throws UnsupportedEncodingException {
69                 CreateNetworkRequest createNetworkRequest = new CreateNetworkRequest();
70                 
71                 //set cloudSiteId as determined for cloud region PO instead of cloudRegion.getLcpCloudRegionId()
72                 createNetworkRequest.setCloudSiteId(cloudRegionPo);
73                 createNetworkRequest.setTenantId(cloudRegion.getTenantId());
74                 createNetworkRequest.setNetworkId(l3Network.getNetworkId());
75                 createNetworkRequest.setNetworkName(l3Network.getNetworkName());
76                 //TODO fields not available
77                 createNetworkRequest.setNetworkType(l3Network.getNetworkType());
78                 //createNetworkRequest.setNetworkTypeVersion(serviceInstance.getModelInfoServiceInstance().getModelVersion());
79                 ModelInfoNetwork modelInfoNetwork  = l3Network.getModelInfoNetwork();
80                 if (modelInfoNetwork != null){
81                         createNetworkRequest.setModelCustomizationUuid(modelInfoNetwork.getModelCustomizationUUID());
82                 }
83
84                 //build and set Subnet list
85                 createNetworkRequest.setSubnets(buildOpenstackSubnetList(l3Network));
86                 
87                 //build and set provider Vlan Network
88                 ProviderVlanNetwork providerVlanNetwork = buildProviderVlanNetwork(l3Network);
89                 createNetworkRequest.setProviderVlanNetwork(providerVlanNetwork);
90                 String networkTechnology = l3Network.getModelInfoNetwork().getNetworkTechnology();
91                 if(networkTechnology == null) {
92                         networkTechnology = l3Network.getNetworkTechnology();
93                         logger.warn("NetworkTechnology was null in CatalogDB. Using field from AAI: " + networkTechnology);
94                 }
95                 createNetworkRequest.setNetworkTechnology(setNetworkTechnology(networkTechnology));
96                 
97                 //build and set Contrail Network
98                 ContrailNetwork contrailNetwork = buildContrailNetwork(l3Network, customer);
99                 createNetworkRequest.setContrailNetwork(contrailNetwork);
100                 
101                 //set Network Parameters from VID request
102                 createNetworkRequest.setNetworkParams(userInput);
103                 
104                 createNetworkRequest = setFlowFlags(createNetworkRequest, orchestrationContext);
105
106                 createNetworkRequest.setMsoRequest(createMsoRequest(requestContext, serviceInstance));
107                 
108                 String messageId = getRandomUuid();
109                 createNetworkRequest.setMessageId(messageId);
110                 createNetworkRequest.setNotificationUrl(createCallbackUrl("NetworkAResponse", messageId));
111
112                 return createNetworkRequest;
113         }
114
115         protected NetworkTechnology setNetworkTechnology(String networkTechnology) {
116                 if(networkTechnology.equalsIgnoreCase("Contrail")) {
117                         return NetworkTechnology.CONTRAIL;
118                 } else if(networkTechnology.equalsIgnoreCase("Neutron")){
119                         return NetworkTechnology.NEUTRON;
120                 } else {
121                         return NetworkTechnology.VMWARE;
122                 }
123         }
124         
125         public DeleteNetworkRequest deleteNetworkRequestMapper(RequestContext requestContext, CloudRegion cloudRegion, ServiceInstance serviceInstance, L3Network l3Network) throws UnsupportedEncodingException {
126                 DeleteNetworkRequest deleteNetworkRequest = new DeleteNetworkRequest();
127                 
128                 deleteNetworkRequest.setCloudSiteId(cloudRegion.getLcpCloudRegionId());
129                 
130                 String messageId = getRandomUuid();
131                 deleteNetworkRequest.setMessageId(messageId);
132                 
133                 ModelInfoNetwork modelInfoNetwork  = l3Network.getModelInfoNetwork();
134                 if (modelInfoNetwork != null){
135                         deleteNetworkRequest.setModelCustomizationUuid(modelInfoNetwork.getModelCustomizationUUID());
136                 }
137                 
138                 deleteNetworkRequest.setMsoRequest(createMsoRequest(requestContext, serviceInstance));
139                 deleteNetworkRequest.setNetworkId(l3Network.getNetworkId());
140                 if (!StringUtils.isEmpty(l3Network.getHeatStackId())){
141                         deleteNetworkRequest.setNetworkStackId(l3Network.getHeatStackId());
142                 }
143                 else {
144                         deleteNetworkRequest.setNetworkStackId(l3Network.getNetworkName());
145                 }
146                 deleteNetworkRequest.setNetworkType(l3Network.getNetworkType());
147                 deleteNetworkRequest.setSkipAAI(true);
148                 deleteNetworkRequest.setTenantId(cloudRegion.getTenantId());
149                 
150                 deleteNetworkRequest.setNotificationUrl(createCallbackUrl("NetworkAResponse", messageId));
151                 
152                 return deleteNetworkRequest;
153         }
154         
155         /**
156          * Access method to build Rollback Network Request
157          * @return
158          * @throws UnsupportedEncodingException
159          */
160         public RollbackNetworkRequest createNetworkRollbackRequestMapper(RequestContext requestContext, CloudRegion cloudRegion, OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, L3Network l3Network, Map<String, String> userInput, String cloudRegionPo, CreateNetworkResponse createNetworkResponse) throws UnsupportedEncodingException {
161                 RollbackNetworkRequest rollbackNetworkRequest = new RollbackNetworkRequest();
162                 
163                 rollbackNetworkRequest = setCommonRollbackRequestFields(rollbackNetworkRequest, requestContext);
164                 
165                 NetworkRollback networkRollback = buildNetworkRollback(l3Network, cloudRegion, cloudRegionPo, createNetworkResponse);
166                 rollbackNetworkRequest.setNetworkRollback(networkRollback);
167                 
168                 return rollbackNetworkRequest;
169         }
170         
171         public UpdateNetworkRequest createNetworkUpdateRequestMapper(RequestContext requestContext, CloudRegion cloudRegion, OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, L3Network l3Network, Map<String, String> userInput, Customer customer) throws UnsupportedEncodingException {
172                 UpdateNetworkRequest updateNetworkRequest = new UpdateNetworkRequest();
173                 
174                 updateNetworkRequest.setCloudSiteId(cloudRegion.getLcpCloudRegionId());
175                 updateNetworkRequest.setTenantId(cloudRegion.getTenantId());
176                 updateNetworkRequest.setNetworkId(l3Network.getNetworkId());
177                 updateNetworkRequest.setNetworkStackId(l3Network.getHeatStackId());
178                 updateNetworkRequest.setNetworkName(l3Network.getNetworkName());
179                 updateNetworkRequest.setNetworkType(l3Network.getModelInfoNetwork().getNetworkType());
180                 updateNetworkRequest.setNetworkTypeVersion(l3Network.getModelInfoNetwork().getModelVersion());
181                 updateNetworkRequest.setModelCustomizationUuid(l3Network.getModelInfoNetwork().getModelCustomizationUUID());
182                 updateNetworkRequest.setSubnets(buildOpenstackSubnetList(l3Network));
183                 updateNetworkRequest.setProviderVlanNetwork(buildProviderVlanNetwork(l3Network));
184                 updateNetworkRequest.setContrailNetwork(buildContrailNetwork(l3Network, customer));
185                 updateNetworkRequest.setNetworkParams(userInput);
186                 updateNetworkRequest.setMsoRequest(createMsoRequest(requestContext, serviceInstance));
187                 
188                 setFlowFlags(updateNetworkRequest, orchestrationContext);
189                 
190                 String messageId = getRandomUuid();
191                 updateNetworkRequest.setMessageId(messageId);
192                 updateNetworkRequest.setNotificationUrl(createCallbackUrl("NetworkAResponse", messageId));
193                 
194                 return updateNetworkRequest;
195         }
196         
197         private RollbackNetworkRequest setCommonRollbackRequestFields(RollbackNetworkRequest request,RequestContext requestContext) throws UnsupportedEncodingException{
198                 request.setSkipAAI(true);
199                 String messageId = requestContext.getMsoRequestId();
200                 request.setMessageId(messageId);
201                 //request.setNotificationUrl(createCallbackUrl("NetworkAResponse", messageId));
202                 return request;
203         }
204         
205         private NetworkRollback buildNetworkRollback(L3Network l3Network, CloudRegion cloudRegion, String cloudRegionPo, CreateNetworkResponse createNetworkResponse){
206                 NetworkRollback networkRollback = new NetworkRollback();
207                 networkRollback.setNetworkId(l3Network.getNetworkId());
208                 networkRollback.setNeutronNetworkId(createNetworkResponse.getMessageId());
209                 networkRollback.setNetworkStackId(createNetworkResponse.getNetworkStackId());
210                 networkRollback.setTenantId(cloudRegion.getTenantId());
211                 networkRollback.setCloudId(cloudRegionPo);
212                 networkRollback.setNetworkType(l3Network.getNetworkType());
213                 ModelInfoNetwork modelInfoNetwork  = l3Network.getModelInfoNetwork();
214                 if (modelInfoNetwork != null){
215                         networkRollback.setModelCustomizationUuid(modelInfoNetwork.getModelCustomizationUUID());
216                 }
217                 //rollback will only be called when network was actually created
218                 networkRollback.setNetworkCreated(createNetworkResponse.getNetworkCreated());
219                 //TODO confirm below not required for create rollback
220                 //NetworkName
221                 //PhysicalNetwork
222                 //Vlans
223                 //msoRequest
224                 return networkRollback;
225         }
226         
227         public MsoRequest createMsoRequest(RequestContext requestContext, ServiceInstance serviceInstance) {
228                 MsoRequest msoRequest = new MsoRequest();
229                 msoRequest.setRequestId(requestContext.getMsoRequestId());
230                 msoRequest.setServiceInstanceId(serviceInstance.getServiceInstanceId());
231                 return msoRequest;
232         }
233         
234         protected String getRandomUuid() {
235                 return UUID.randomUUID().toString();
236         }
237         
238         protected String createCallbackUrl(String messageType, String correlator) throws UnsupportedEncodingException {
239                 String endpoint = this.getEndpoint();
240
241                 while (endpoint.endsWith("/")) {
242                         endpoint = endpoint.substring(0, endpoint.length()-1);
243                 }
244                 return endpoint + "/" + UriUtils.encodePathSegment(messageType, "UTF-8") + "/" + UriUtils.encodePathSegment(correlator, "UTF-8");
245         }
246         
247         protected String getEndpoint() {
248                 return UrnPropertiesReader.getVariable("mso.workflow.message.endpoint");
249         }
250         /**
251          * Use BB L3Network object to build subnets list of type org.onap.so.openstack.beans.Subnet
252          * @param L3Network
253          * @return List<org.onap.so.openstack.beans.Subnet>
254          */
255         private List<Subnet> buildOpenstackSubnetList(L3Network l3Network){
256                 
257                 List<org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet> subnets = l3Network.getSubnets();
258                 List<org.onap.so.openstack.beans.Subnet> subnetList = new ArrayList<org.onap.so.openstack.beans.Subnet>();
259                 //create mapper from onap Subnet to openstack bean Subnet
260                 if(modelMapper.getTypeMap(org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet.class, org.onap.so.openstack.beans.Subnet.class) == null) {
261                         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>() {
262                                   protected void configure() {
263                                     map().setSubnetName(source.getSubnetName());
264                                     map(source.getSubnetId(), destination.getSubnetId());
265                                     map(source.getNeutronSubnetId(), destination.getNeutronId());
266                                     map(source.getGatewayAddress(), destination.getGatewayIp());
267                                     map(source.getIpVersion(), destination.getIpVersion());
268                                     map(source.isDhcpEnabled(), destination.getEnableDHCP());
269                                     map(source.getSubnetSequence(), destination.getSubnetSequence());
270                                   }
271                                 };
272                         modelMapper.addMappings(personMap);
273                 }
274                 
275                 for (org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet subnet : subnets) {
276                         org.onap.so.openstack.beans.Subnet openstackSubnet = modelMapper.map(subnet, org.onap.so.openstack.beans.Subnet.class);
277                         //update cidr value
278                         if (subnet.getNetworkStartAddress() != null && subnet.getCidrMask() != null)
279                                 openstackSubnet.setCidr(subnet.getNetworkStartAddress().concat(FORWARD_SLASH).concat(subnet.getCidrMask()));
280                         List<org.onap.so.bpmn.servicedecomposition.bbobjects.HostRoute> hostRouteList = subnet.getHostRoutes();
281                         List<org.onap.so.openstack.beans.HostRoute> openstackHostRouteList = new ArrayList<>();
282                         org.onap.so.openstack.beans.HostRoute openstackHostRoute = new org.onap.so.openstack.beans.HostRoute();
283                         //TODO only 2 fields available on openstack object. Confirm it is sufficient or add as needed
284                         for (org.onap.so.bpmn.servicedecomposition.bbobjects.HostRoute hostRoute : hostRouteList) {
285                                 openstackHostRoute.setNextHop(hostRoute.getNextHop());
286                                 openstackHostRoute.setPrefix(hostRoute.getRoutePrefix());
287                                 //add host route to the list
288                                 openstackHostRouteList.add(openstackHostRoute);
289                         }
290                         openstackSubnet.setHostRoutes(openstackHostRouteList);
291                         //add subnet to the list
292                         subnetList.add(openstackSubnet);
293                 }
294                 return subnetList;
295         }
296         
297         private ProviderVlanNetwork buildProviderVlanNetwork(L3Network l3Network){
298                 ProviderVlanNetwork providerVlanNetwork = new ProviderVlanNetwork();
299                 providerVlanNetwork.setPhysicalNetworkName(l3Network.getPhysicalNetworkName());
300                 List<Integer> vlans = new ArrayList<Integer>();
301                 List<org.onap.so.bpmn.servicedecomposition.bbobjects.SegmentationAssignment> segmentationAssignments = l3Network.getSegmentationAssignments();
302                 for (org.onap.so.bpmn.servicedecomposition.bbobjects.SegmentationAssignment assignment : segmentationAssignments) {
303                         vlans.add(Integer.valueOf(assignment.getSegmentationId()));
304                 }
305                 providerVlanNetwork.setVlans(vlans);
306                 return providerVlanNetwork;
307         }
308
309         private ContrailNetwork buildContrailNetwork(L3Network l3Network, Customer customer){
310                 ContrailNetwork contrailNetwork = new ContrailNetwork();
311                 contrailNetwork.setExternal(Optional.ofNullable(l3Network.isIsExternalNetwork()).orElse(false).toString());
312                 contrailNetwork.setShared(Optional.ofNullable(l3Network.isIsSharedNetwork()).orElse(false).toString());
313                 contrailNetwork.setPolicyFqdns(buildPolicyFqdns(l3Network.getNetworkPolicies()));
314                 contrailNetwork.setRouteTableFqdns(buildRouteTableFqdns(l3Network.getContrailNetworkRouteTableReferences()));
315                 if(customer!= null)
316                         contrailNetwork.setRouteTargets(buildRouteTargets(customer.getVpnBindings()));
317                 //PolicyFqdns(policyFqdns); --- is set in getAAINetworkPolicy
318                 //RouteTableFqdns(routeTableFqdns); --- is set in getAAINetworkTableRef
319                 //RouteTargets(routeTargets); --- is set in getAAINetworkVpnBinding
320                 return contrailNetwork;
321         }
322         
323         private List<String> buildPolicyFqdns(List<NetworkPolicy> networkPolicies) {
324                 List<String> policyFqdns = new ArrayList<>();
325                 for(NetworkPolicy networkPolicy : networkPolicies) {
326                         policyFqdns.add(networkPolicy.getNetworkPolicyFqdn());
327                 }
328                 return policyFqdns;
329         }
330         
331         private List<String> buildRouteTableFqdns(List<RouteTableReference> contrailNetworkRouteTableReferences) {
332                 List<String> routeTableFqdns = new ArrayList<>();
333                 for(RouteTableReference routeTableReference : contrailNetworkRouteTableReferences) {
334                         routeTableFqdns.add(routeTableReference.getRouteTableReferenceFqdn());
335                 }
336                 return routeTableFqdns;
337         }
338
339         private List<RouteTarget> buildRouteTargets(List<VpnBinding> vpnBindings) {
340                 if(modelMapper.getTypeMap(org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTarget.class, RouteTarget.class) == null) {
341                         modelMapper.addMappings(new PropertyMap<org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTarget, RouteTarget>() {
342                                 @Override
343                                 protected void configure() {
344                                         map().setRouteTarget(source.getGlobalRouteTarget());
345                                         map().setRouteTargetRole(source.getRouteTargetRole());
346                                 }
347                         });
348                 }
349                 
350                 List<RouteTarget> routeTargets = new ArrayList<>();
351                 for(VpnBinding vpnBinding : vpnBindings) {
352                         for(org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTarget routeTarget : vpnBinding.getRouteTargets()) {
353                                 routeTargets.add(modelMapper.map(routeTarget, RouteTarget.class));
354                         }
355                 }
356                 return routeTargets;
357         }
358
359         private CreateNetworkRequest setFlowFlags(CreateNetworkRequest createNetworkRequest, OrchestrationContext orchestrationContext){
360                 //TODO confirm flag value
361                 createNetworkRequest.setSkipAAI(true);          
362                 createNetworkRequest.setBackout(Boolean.TRUE.equals(orchestrationContext.getIsRollbackEnabled()));
363                 //TODO confirm value - false by default
364                 createNetworkRequest.setFailIfExists(true);
365                 //NetworkTechnology(NetworkTechnology.NEUTRON); NOOP - default
366                 return createNetworkRequest;
367         }
368         
369         private void setFlowFlags(UpdateNetworkRequest updateNetworkRequest, OrchestrationContext orchestrationContext){
370                 updateNetworkRequest.setSkipAAI(true);          
371                 updateNetworkRequest.setBackout(Boolean.TRUE.equals(orchestrationContext.getIsRollbackEnabled()));
372                 //NetworkTechnology(NetworkTechnology.NEUTRON); NOOP - default
373         }
374 }