2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Modifications Copyright (c) 2020 Nokia
8 * ================================================================================
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 * ============LICENSE_END=========================================================
23 package org.onap.so.client.adapter.network.mapper;
25 import java.io.UnsupportedEncodingException;
26 import java.util.ArrayList;
27 import java.util.HashMap;
28 import java.util.List;
30 import java.util.Optional;
31 import java.util.UUID;
32 import org.apache.commons.lang3.StringUtils;
33 import org.modelmapper.ModelMapper;
34 import org.modelmapper.PropertyMap;
35 import org.onap.so.adapters.nwrest.ContrailNetwork;
36 import org.onap.so.adapters.nwrest.CreateNetworkRequest;
37 import org.onap.so.adapters.nwrest.CreateNetworkResponse;
38 import org.onap.so.adapters.nwrest.DeleteNetworkRequest;
39 import org.onap.so.adapters.nwrest.ProviderVlanNetwork;
40 import org.onap.so.adapters.nwrest.RollbackNetworkRequest;
41 import org.onap.so.adapters.nwrest.UpdateNetworkRequest;
42 import org.onap.so.bpmn.core.UrnPropertiesReader;
43 import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
44 import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer;
45 import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network;
46 import org.onap.so.bpmn.servicedecomposition.bbobjects.NetworkPolicy;
47 import org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTableReference;
48 import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
49 import org.onap.so.bpmn.servicedecomposition.bbobjects.VpnBinding;
50 import org.onap.so.bpmn.servicedecomposition.generalobjects.OrchestrationContext;
51 import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext;
52 import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoNetwork;
53 import org.onap.so.entity.MsoRequest;
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.onap.so.bpmn.servicedecomposition.bbobjects.SegmentationAssignment;
58 import org.slf4j.Logger;
59 import org.slf4j.LoggerFactory;
60 import org.springframework.stereotype.Component;
61 import org.springframework.web.util.UriUtils;
64 public class NetworkAdapterObjectMapper {
65 private static final ModelMapper modelMapper = new ModelMapper();
66 private static String FORWARD_SLASH = "/";
67 private static final Logger logger = LoggerFactory.getLogger(NetworkAdapterObjectMapper.class);
69 public CreateNetworkRequest createNetworkRequestMapper(RequestContext requestContext, CloudRegion cloudRegion,
70 OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, L3Network l3Network,
71 Map<String, String> userInput, String cloudRegionPo, Customer customer) {
72 CreateNetworkRequest createNetworkRequest = new CreateNetworkRequest();
74 // set cloudSiteId as determined for cloud region PO instead of cloudRegion.getLcpCloudRegionId()
75 createNetworkRequest.setCloudSiteId(cloudRegionPo);
76 createNetworkRequest.setTenantId(cloudRegion.getTenantId());
77 createNetworkRequest.setNetworkId(l3Network.getNetworkId());
78 createNetworkRequest.setNetworkName(l3Network.getNetworkName());
79 // TODO fields not available
80 createNetworkRequest.setNetworkType(l3Network.getNetworkType());
81 // createNetworkRequest.setNetworkTypeVersion(serviceInstance.getModelInfoServiceInstance().getModelVersion());
82 ModelInfoNetwork modelInfoNetwork = l3Network.getModelInfoNetwork();
83 if (modelInfoNetwork != null) {
84 createNetworkRequest.setModelCustomizationUuid(modelInfoNetwork.getModelCustomizationUUID());
87 // build and set Subnet list
88 createNetworkRequest.setSubnets(buildOpenstackSubnetList(l3Network));
90 // build and set provider Vlan Network
91 ProviderVlanNetwork providerVlanNetwork = buildProviderVlanNetwork(l3Network);
92 createNetworkRequest.setProviderVlanNetwork(providerVlanNetwork);
93 String networkTechnology = l3Network.getModelInfoNetwork().getNetworkTechnology();
94 if (networkTechnology == null) {
95 networkTechnology = l3Network.getNetworkTechnology();
96 logger.warn("NetworkTechnology was null in CatalogDB. Using field from AAI: " + networkTechnology);
98 if (networkTechnology != null) {
99 createNetworkRequest.setNetworkTechnology(networkTechnology.toUpperCase());
100 if (createNetworkRequest.getNetworkTechnology().contains("CONTRAIL")) {
101 createNetworkRequest.setContrailRequest(true);
105 // build and set Contrail Network
106 ContrailNetwork contrailNetwork = buildContrailNetwork(l3Network, customer);
107 createNetworkRequest.setContrailNetwork(contrailNetwork);
109 // set Network Parameters from VID request, add "shared" and "external" to this map
110 createNetworkRequest.setNetworkParams(addSharedAndExternal(userInput, l3Network));
112 createNetworkRequest = setFlowFlags(createNetworkRequest, orchestrationContext);
114 createNetworkRequest.setMsoRequest(createMsoRequest(requestContext, serviceInstance));
116 String messageId = getRandomUuid();
117 createNetworkRequest.setMessageId(messageId);
118 createNetworkRequest.setNotificationUrl(createCallbackUrl("NetworkAResponse", messageId));
120 return createNetworkRequest;
123 public DeleteNetworkRequest deleteNetworkRequestMapper(RequestContext requestContext, CloudRegion cloudRegion,
124 ServiceInstance serviceInstance, L3Network l3Network) {
125 DeleteNetworkRequest deleteNetworkRequest = new DeleteNetworkRequest();
127 deleteNetworkRequest.setCloudSiteId(cloudRegion.getLcpCloudRegionId());
129 String messageId = getRandomUuid();
130 deleteNetworkRequest.setMessageId(messageId);
132 ModelInfoNetwork modelInfoNetwork = l3Network.getModelInfoNetwork();
133 if (modelInfoNetwork != null) {
134 deleteNetworkRequest.setModelCustomizationUuid(modelInfoNetwork.getModelCustomizationUUID());
137 deleteNetworkRequest.setMsoRequest(createMsoRequest(requestContext, serviceInstance));
138 deleteNetworkRequest.setNetworkId(l3Network.getNetworkId());
139 if (!StringUtils.isEmpty(l3Network.getHeatStackId())) {
140 deleteNetworkRequest.setNetworkStackId(l3Network.getHeatStackId());
142 deleteNetworkRequest.setNetworkStackId(l3Network.getNetworkName());
144 deleteNetworkRequest.setNetworkType(l3Network.getNetworkType());
145 deleteNetworkRequest.setSkipAAI(true);
146 deleteNetworkRequest.setTenantId(cloudRegion.getTenantId());
148 deleteNetworkRequest.setNotificationUrl(createCallbackUrl("NetworkAResponse", messageId));
150 return deleteNetworkRequest;
154 * Access method to build Rollback Network Request
157 * @throws UnsupportedEncodingException
159 public RollbackNetworkRequest createNetworkRollbackRequestMapper(RequestContext requestContext,
160 CloudRegion cloudRegion, OrchestrationContext orchestrationContext, ServiceInstance serviceInstance,
161 L3Network l3Network, Map<String, String> userInput, String cloudRegionPo,
162 CreateNetworkResponse createNetworkResponse) {
163 RollbackNetworkRequest rollbackNetworkRequest = new RollbackNetworkRequest();
165 rollbackNetworkRequest = setCommonRollbackRequestFields(rollbackNetworkRequest, requestContext);
167 NetworkRollback networkRollback =
168 buildNetworkRollback(l3Network, cloudRegion, cloudRegionPo, createNetworkResponse);
169 rollbackNetworkRequest.setNetworkRollback(networkRollback);
171 return rollbackNetworkRequest;
174 public UpdateNetworkRequest createNetworkUpdateRequestMapper(RequestContext requestContext, CloudRegion cloudRegion,
175 OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, L3Network l3Network,
176 Map<String, String> userInput, Customer customer) {
177 UpdateNetworkRequest updateNetworkRequest = new UpdateNetworkRequest();
179 updateNetworkRequest.setCloudSiteId(cloudRegion.getLcpCloudRegionId());
180 updateNetworkRequest.setTenantId(cloudRegion.getTenantId());
181 updateNetworkRequest.setNetworkId(l3Network.getNetworkId());
182 updateNetworkRequest.setNetworkStackId(l3Network.getHeatStackId());
183 updateNetworkRequest.setNetworkName(l3Network.getNetworkName());
184 updateNetworkRequest.setNetworkType(l3Network.getModelInfoNetwork().getNetworkType());
185 updateNetworkRequest.setNetworkTypeVersion(l3Network.getModelInfoNetwork().getModelVersion());
186 updateNetworkRequest.setModelCustomizationUuid(l3Network.getModelInfoNetwork().getModelCustomizationUUID());
187 updateNetworkRequest.setSubnets(buildOpenstackSubnetList(l3Network));
188 updateNetworkRequest.setProviderVlanNetwork(buildProviderVlanNetwork(l3Network));
189 updateNetworkRequest.setContrailNetwork(buildContrailNetwork(l3Network, customer));
190 updateNetworkRequest.setNetworkParams(addSharedAndExternal(userInput, l3Network));
191 updateNetworkRequest.setMsoRequest(createMsoRequest(requestContext, serviceInstance));
193 setFlowFlags(updateNetworkRequest, orchestrationContext);
195 String messageId = getRandomUuid();
196 updateNetworkRequest.setMessageId(messageId);
197 updateNetworkRequest.setNotificationUrl(createCallbackUrl("NetworkAResponse", messageId));
199 return updateNetworkRequest;
202 private RollbackNetworkRequest setCommonRollbackRequestFields(RollbackNetworkRequest request,
203 RequestContext requestContext) {
204 request.setSkipAAI(true);
205 String messageId = requestContext.getMsoRequestId();
206 request.setMessageId(messageId);
210 private NetworkRollback buildNetworkRollback(L3Network l3Network, CloudRegion cloudRegion, String cloudRegionPo,
211 CreateNetworkResponse createNetworkResponse) {
212 NetworkRollback networkRollback = new NetworkRollback();
213 networkRollback.setNetworkId(l3Network.getNetworkId());
214 networkRollback.setNeutronNetworkId(createNetworkResponse.getMessageId());
215 networkRollback.setNetworkStackId(createNetworkResponse.getNetworkStackId());
216 networkRollback.setTenantId(cloudRegion.getTenantId());
217 networkRollback.setCloudId(cloudRegionPo);
218 networkRollback.setNetworkType(l3Network.getNetworkType());
219 ModelInfoNetwork modelInfoNetwork = l3Network.getModelInfoNetwork();
220 if (modelInfoNetwork != null) {
221 networkRollback.setModelCustomizationUuid(modelInfoNetwork.getModelCustomizationUUID());
223 // rollback will only be called when network was actually created
224 networkRollback.setNetworkCreated(createNetworkResponse.getNetworkCreated());
225 // TODO confirm below not required for create rollback
230 return networkRollback;
233 public MsoRequest createMsoRequest(RequestContext requestContext, ServiceInstance serviceInstance) {
234 MsoRequest msoRequest = new MsoRequest();
235 msoRequest.setRequestId(requestContext.getMsoRequestId());
236 msoRequest.setServiceInstanceId(serviceInstance.getServiceInstanceId());
240 protected String getRandomUuid() {
241 return UUID.randomUUID().toString();
244 protected String createCallbackUrl(String messageType, String correlator) {
245 String endpoint = this.getEndpoint();
247 while (endpoint.endsWith("/")) {
248 endpoint = endpoint.substring(0, endpoint.length() - 1);
250 return endpoint + "/" + UriUtils.encodePathSegment(messageType, "UTF-8") + "/"
251 + UriUtils.encodePathSegment(correlator, "UTF-8");
254 protected String getEndpoint() {
255 return UrnPropertiesReader.getVariable("mso.workflow.message.endpoint");
259 * Use BB L3Network object to build subnets list of type org.onap.so.openstack.beans.Subnet
262 * @return List<org.onap.so.openstack.beans.Subnet>
264 protected List<Subnet> buildOpenstackSubnetList(L3Network l3Network) {
266 List<org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet> subnets = l3Network.getSubnets();
267 List<org.onap.so.openstack.beans.Subnet> subnetList = new ArrayList<>();
268 // create mapper from onap Subnet to openstack bean Subnet
269 if (modelMapper.getTypeMap(org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet.class,
270 org.onap.so.openstack.beans.Subnet.class) == null) {
271 PropertyMap<org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet, org.onap.so.openstack.beans.Subnet> personMap =
272 new PropertyMap<org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet, org.onap.so.openstack.beans.Subnet>() {
274 protected void configure() {
275 map().setSubnetName(source.getSubnetName());
276 map(source.getSubnetId(), destination.getSubnetId());
277 map(source.getNeutronSubnetId(), destination.getNeutronId());
278 map(source.getGatewayAddress(), destination.getGatewayIp());
279 map(source.getIpVersion(), destination.getIpVersion());
280 map(source.isDhcpEnabled(), destination.getEnableDHCP());
281 map(source.getSubnetSequence(), destination.getSubnetSequence());
284 modelMapper.addMappings(personMap);
287 for (org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet subnet : subnets) {
288 org.onap.so.openstack.beans.Subnet openstackSubnet =
289 modelMapper.map(subnet, org.onap.so.openstack.beans.Subnet.class);
290 if (StringUtils.isEmpty(openstackSubnet.getGatewayIp())) {
291 openstackSubnet.setGatewayIp("NULL");
294 if (subnet.getNetworkStartAddress() != null && subnet.getCidrMask() != null)
296 .setCidr(subnet.getNetworkStartAddress().concat(FORWARD_SLASH).concat(subnet.getCidrMask()));
297 List<org.onap.so.bpmn.servicedecomposition.bbobjects.HostRoute> hostRouteList = subnet.getHostRoutes();
298 List<org.onap.so.openstack.beans.HostRoute> openstackHostRouteList = new ArrayList<>();
299 org.onap.so.openstack.beans.HostRoute openstackHostRoute;
300 // TODO only 2 fields available on openstack object. Confirm it is sufficient or add as needed
301 for (org.onap.so.bpmn.servicedecomposition.bbobjects.HostRoute hostRoute : hostRouteList) {
302 openstackHostRoute = new org.onap.so.openstack.beans.HostRoute();
303 openstackHostRoute.setNextHop(hostRoute.getNextHop());
304 openstackHostRoute.setPrefix(hostRoute.getRoutePrefix());
305 // add host route to the list
306 openstackHostRouteList.add(openstackHostRoute);
308 if (subnet.getDhcpStart() != null && !subnet.getDhcpStart().equals("")) {
309 org.onap.so.openstack.beans.Pool openstackAllocationPool = new org.onap.so.openstack.beans.Pool();
310 openstackAllocationPool.setStart(subnet.getDhcpStart());
311 openstackAllocationPool.setEnd(subnet.getDhcpEnd());
312 List<org.onap.so.openstack.beans.Pool> allocationPools = new ArrayList<>();
313 allocationPools.add(openstackAllocationPool);
314 openstackSubnet.setAllocationPools(allocationPools);
316 openstackSubnet.setHostRoutes(openstackHostRouteList);
317 // add subnet to the list
318 subnetList.add(openstackSubnet);
323 private ProviderVlanNetwork buildProviderVlanNetwork(L3Network l3Network) {
324 ProviderVlanNetwork providerVlanNetwork = new ProviderVlanNetwork();
325 providerVlanNetwork.setPhysicalNetworkName(l3Network.getPhysicalNetworkName());
326 List<Integer> vlans = new ArrayList<>();
327 List<SegmentationAssignment> segmentationAssignments = l3Network.getSegmentationAssignments();
328 for (SegmentationAssignment assignment : segmentationAssignments) {
329 vlans.add(Integer.valueOf(assignment.getSegmentationId()));
331 providerVlanNetwork.setVlans(vlans);
332 return providerVlanNetwork;
335 private ContrailNetwork buildContrailNetwork(L3Network l3Network, Customer customer) {
336 ContrailNetwork contrailNetwork = new ContrailNetwork();
337 contrailNetwork.setExternal(Optional.ofNullable(l3Network.isIsExternalNetwork()).orElse(false).toString());
338 contrailNetwork.setShared(Optional.ofNullable(l3Network.isIsSharedNetwork()).orElse(false).toString());
339 contrailNetwork.setPolicyFqdns(buildPolicyFqdns(l3Network.getNetworkPolicies()));
340 contrailNetwork.setRouteTableFqdns(buildRouteTableFqdns(l3Network.getContrailNetworkRouteTableReferences()));
341 if (customer != null)
342 contrailNetwork.setRouteTargets(buildRouteTargets(customer.getVpnBindings()));
343 // PolicyFqdns(policyFqdns); --- is set in getAAINetworkPolicy
344 // RouteTableFqdns(routeTableFqdns); --- is set in getAAINetworkTableRef
345 // RouteTargets(routeTargets); --- is set in getAAINetworkVpnBinding
346 return contrailNetwork;
349 private List<String> buildPolicyFqdns(List<NetworkPolicy> networkPolicies) {
350 List<String> policyFqdns = new ArrayList<>();
351 for (NetworkPolicy networkPolicy : networkPolicies) {
352 policyFqdns.add(networkPolicy.getNetworkPolicyFqdn());
357 private List<String> buildRouteTableFqdns(List<RouteTableReference> contrailNetworkRouteTableReferences) {
358 List<String> routeTableFqdns = new ArrayList<>();
359 for (RouteTableReference routeTableReference : contrailNetworkRouteTableReferences) {
360 routeTableFqdns.add(routeTableReference.getRouteTableReferenceFqdn());
362 return routeTableFqdns;
365 private List<RouteTarget> buildRouteTargets(List<VpnBinding> vpnBindings) {
366 if (modelMapper.getTypeMap(org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTarget.class,
367 RouteTarget.class) == null) {
368 modelMapper.addMappings(
369 new PropertyMap<org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTarget, RouteTarget>() {
371 protected void configure() {
372 map().setRouteTarget(source.getGlobalRouteTarget());
373 map().setRouteTargetRole(source.getRouteTargetRole());
378 List<RouteTarget> routeTargets = new ArrayList<>();
379 for (VpnBinding vpnBinding : vpnBindings) {
380 for (org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTarget routeTarget : vpnBinding
381 .getRouteTargets()) {
382 routeTargets.add(modelMapper.map(routeTarget, RouteTarget.class));
388 private CreateNetworkRequest setFlowFlags(CreateNetworkRequest createNetworkRequest,
389 OrchestrationContext orchestrationContext) {
390 // TODO confirm flag value
391 createNetworkRequest.setSkipAAI(true);
392 createNetworkRequest.setBackout(Boolean.TRUE.equals(orchestrationContext.getIsRollbackEnabled()));
393 // TODO confirm value - false by default
394 createNetworkRequest.setFailIfExists(false);
395 // NetworkTechnology(NetworkTechnology.NEUTRON); NOOP - default
396 return createNetworkRequest;
399 private void setFlowFlags(UpdateNetworkRequest updateNetworkRequest, OrchestrationContext orchestrationContext) {
400 updateNetworkRequest.setSkipAAI(true);
401 updateNetworkRequest.setBackout(Boolean.TRUE.equals(orchestrationContext.getIsRollbackEnabled()));
402 // NetworkTechnology(NetworkTechnology.NEUTRON); NOOP - default
405 private Map<String, String> addSharedAndExternal(Map<String, String> userInput, L3Network l3Network) {
406 if (userInput == null)
407 userInput = new HashMap<>();
408 if (!userInput.containsKey("shared")) {
409 userInput.put("shared", Optional.ofNullable(l3Network.isIsSharedNetwork()).orElse(false).toString());
411 if (!userInput.containsKey("external")) {
412 userInput.put("external", Optional.ofNullable(l3Network.isIsExternalNetwork()).orElse(false).toString());