update install and configure document
[so.git] / bpmn / so-bpmn-tasks / src / main / java / org / onap / so / client / adapter / network / mapper / NetworkAdapterObjectMapper.java
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.UUID;
28
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;
49
50 @Component
51 public class NetworkAdapterObjectMapper {
52         private static final ModelMapper modelMapper = new ModelMapper();
53         private static String FORWARD_SLASH = "/";
54
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();
57                 
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());
69                 }
70
71                 //build and set Subnet list
72                 createNetworkRequest.setSubnets(buildOpenstackSubnetList(l3Network));
73                 
74                 //build and set provider Vlan Network
75                 ProviderVlanNetwork providerVlanNetwork = buildProviderVlanNetwork(l3Network);
76                 createNetworkRequest.setProviderVlanNetwork(providerVlanNetwork);
77                 
78                 //build and set Contrail Network
79                 ContrailNetwork contrailNetwork = buildContrailNetwork(l3Network, customer);
80                 createNetworkRequest.setContrailNetwork(contrailNetwork);
81                 
82                 //set Network Parameters from VID request
83                 createNetworkRequest.setNetworkParams(userInput);
84                 
85                 createNetworkRequest = setFlowFlags(createNetworkRequest, orchestrationContext);
86
87                 createNetworkRequest.setMsoRequest(createMsoRequest(requestContext, serviceInstance));
88                 
89                 String messageId = getRandomUuid();
90                 createNetworkRequest.setMessageId(messageId);
91                 //TODO clarify callback URL build process
92                 //createNetworkRequest.setNotificationUrl(createCallbackUrl("NetworkAResponse", messageId));
93
94                 return createNetworkRequest;
95         }
96         
97         public DeleteNetworkRequest deleteNetworkRequestMapper(RequestContext requestContext, CloudRegion cloudRegion, ServiceInstance serviceInstance, L3Network l3Network) throws UnsupportedEncodingException {
98                 DeleteNetworkRequest deleteNetworkRequest = new DeleteNetworkRequest();
99                 
100                 deleteNetworkRequest.setCloudSiteId(cloudRegion.getLcpCloudRegionId());
101                 
102                 String messageId = getRandomUuid();
103                 deleteNetworkRequest.setMessageId(messageId);
104                 
105                 ModelInfoNetwork modelInfoNetwork  = l3Network.getModelInfoNetwork();
106                 if (modelInfoNetwork != null){
107                         deleteNetworkRequest.setModelCustomizationUuid(modelInfoNetwork.getModelCustomizationUUID());
108                 }
109                 
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());
116                 
117                 return deleteNetworkRequest;
118         }
119         
120         /**
121          * Access method to build Rollback Network Request
122          * @return
123          * @throws UnsupportedEncodingException
124          */
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();
127                 
128                 rollbackNetworkRequest = setCommonRollbackRequestFields(rollbackNetworkRequest, requestContext);
129                 
130                 NetworkRollback networkRollback = buildNetworkRollback(l3Network, cloudRegion, cloudRegionPo, createNetworkResponse);
131                 rollbackNetworkRequest.setNetworkRollback(networkRollback);
132                 
133                 return rollbackNetworkRequest;
134         }
135         
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();
138                 
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));
152                 
153                 setFlowFlags(updateNetworkRequest, orchestrationContext);
154                 
155                 String messageId = getRandomUuid();
156                 updateNetworkRequest.setMessageId(messageId);
157                 updateNetworkRequest.setNotificationUrl(createCallbackUrl("NetworkAResponse", messageId));
158                 
159                 return updateNetworkRequest;
160         }
161         
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));
168                 return request;
169         }
170         
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());
182                 }
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
186                 //NetworkName
187                 //PhysicalNetwork
188                 //Vlans
189                 //msoRequest
190                 return networkRollback;
191         }
192         
193         public MsoRequest createMsoRequest(RequestContext requestContext, ServiceInstance serviceInstance) {
194                 MsoRequest msoRequest = new MsoRequest();
195                 msoRequest.setRequestId(requestContext.getMsoRequestId());
196                 msoRequest.setServiceInstanceId(serviceInstance.getServiceInstanceId());
197                 return msoRequest;
198         }
199         
200         protected String getRandomUuid() {
201                 return UUID.randomUUID().toString();
202         }
203         
204         protected String createCallbackUrl(String messageType, String correlator) throws UnsupportedEncodingException {
205                 String endpoint = this.getEndpoint();
206
207                 while (endpoint.endsWith("/")) {
208                         endpoint = endpoint.substring(0, endpoint.length()-1);
209                 }
210                 return endpoint + "/" + UriUtils.encodePathSegment(messageType, "UTF-8") + "/" + UriUtils.encodePathSegment(correlator, "UTF-8");
211         }
212         
213         protected String getEndpoint() {
214                 return UrnPropertiesReader.getVariable("mso.workflow.message.endpoint");
215         }
216         /**
217          * Use BB L3Network object to build subnets list of type org.onap.so.openstack.beans.Subnet
218          * @param L3Network
219          * @return List<org.onap.so.openstack.beans.Subnet>
220          */
221         private List<Subnet> buildOpenstackSubnetList(L3Network l3Network){
222                 
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());
235                                   }
236                                 };
237                         modelMapper.addMappings(personMap);
238                 }
239                 
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);
242                         //update cidr value
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);
254                         }
255                         openstackSubnet.setHostRoutes(openstackHostRouteList);
256                         //add subnet to the list
257                         subnetList.add(openstackSubnet);
258                 }
259                 return subnetList;
260         }
261         
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()));
269                 }
270                 providerVlanNetwork.setVlans(vlans);
271                 return providerVlanNetwork;
272         }
273
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()));
280                 if(customer!= null)
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;
286         }
287         
288         private List<String> buildPolicyFqdns(List<NetworkPolicy> networkPolicies) {
289                 List<String> policyFqdns = new ArrayList<>();
290                 for(NetworkPolicy networkPolicy : networkPolicies) {
291                         policyFqdns.add(networkPolicy.getNetworkPolicyFqdn());
292                 }
293                 return policyFqdns;
294         }
295         
296         private List<String> buildRouteTableFqdns(List<RouteTableReference> contrailNetworkRouteTableReferences) {
297                 List<String> routeTableFqdns = new ArrayList<>();
298                 for(RouteTableReference routeTableReference : contrailNetworkRouteTableReferences) {
299                         routeTableFqdns.add(routeTableReference.getRouteTableReferenceFqdn());
300                 }
301                 return routeTableFqdns;
302         }
303
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>() {
307                                 @Override
308                                 protected void configure() {
309                                         map().setRouteTarget(source.getGlobalRouteTarget());
310                                         map().setRouteTargetRole(source.getRouteTargetRole());
311                                 }
312                         });
313                 }
314                 
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));
319                         }
320                 }
321                 return routeTargets;
322         }
323
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;
333         }
334         
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
340         }
341 }