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