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.HashMap;
26 import java.util.List;
28 import java.util.Optional;
29 import java.util.UUID;
31 import org.apache.commons.lang3.StringUtils;
32 import org.modelmapper.ModelMapper;
33 import org.modelmapper.PropertyMap;
34 import org.onap.so.adapters.nwrest.ContrailNetwork;
35 import org.onap.so.adapters.nwrest.CreateNetworkRequest;
36 import org.onap.so.adapters.nwrest.CreateNetworkResponse;
37 import org.onap.so.adapters.nwrest.DeleteNetworkRequest;
38 import org.onap.so.adapters.nwrest.NetworkTechnology;
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.slf4j.Logger;
58 import org.slf4j.LoggerFactory;
59 import org.springframework.stereotype.Component;
60 import org.springframework.web.util.UriUtils;
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);
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();
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());
84 //build and set Subnet list
85 createNetworkRequest.setSubnets(buildOpenstackSubnetList(l3Network));
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);
95 if (networkTechnology != null) {
96 createNetworkRequest.setNetworkTechnology(networkTechnology.toUpperCase());
97 if (createNetworkRequest.getNetworkTechnology().contains("CONTRAIL")) {
98 createNetworkRequest.setContrailRequest(true);
102 //build and set Contrail Network
103 ContrailNetwork contrailNetwork = buildContrailNetwork(l3Network, customer);
104 createNetworkRequest.setContrailNetwork(contrailNetwork);
106 //set Network Parameters from VID request, add "shared" and "external" to this map
107 createNetworkRequest.setNetworkParams(addSharedAndExternal(userInput, l3Network));
109 createNetworkRequest = setFlowFlags(createNetworkRequest, orchestrationContext);
111 createNetworkRequest.setMsoRequest(createMsoRequest(requestContext, serviceInstance));
113 String messageId = getRandomUuid();
114 createNetworkRequest.setMessageId(messageId);
115 createNetworkRequest.setNotificationUrl(createCallbackUrl("NetworkAResponse", messageId));
117 return createNetworkRequest;
120 public DeleteNetworkRequest deleteNetworkRequestMapper(RequestContext requestContext, CloudRegion cloudRegion, ServiceInstance serviceInstance, L3Network l3Network) throws UnsupportedEncodingException {
121 DeleteNetworkRequest deleteNetworkRequest = new DeleteNetworkRequest();
123 deleteNetworkRequest.setCloudSiteId(cloudRegion.getLcpCloudRegionId());
125 String messageId = getRandomUuid();
126 deleteNetworkRequest.setMessageId(messageId);
128 ModelInfoNetwork modelInfoNetwork = l3Network.getModelInfoNetwork();
129 if (modelInfoNetwork != null){
130 deleteNetworkRequest.setModelCustomizationUuid(modelInfoNetwork.getModelCustomizationUUID());
133 deleteNetworkRequest.setMsoRequest(createMsoRequest(requestContext, serviceInstance));
134 deleteNetworkRequest.setNetworkId(l3Network.getNetworkId());
135 if (!StringUtils.isEmpty(l3Network.getHeatStackId())){
136 deleteNetworkRequest.setNetworkStackId(l3Network.getHeatStackId());
139 deleteNetworkRequest.setNetworkStackId(l3Network.getNetworkName());
141 deleteNetworkRequest.setNetworkType(l3Network.getNetworkType());
142 deleteNetworkRequest.setSkipAAI(true);
143 deleteNetworkRequest.setTenantId(cloudRegion.getTenantId());
145 deleteNetworkRequest.setNotificationUrl(createCallbackUrl("NetworkAResponse", messageId));
147 return deleteNetworkRequest;
151 * Access method to build Rollback Network Request
153 * @throws UnsupportedEncodingException
155 public RollbackNetworkRequest createNetworkRollbackRequestMapper(RequestContext requestContext, CloudRegion cloudRegion, OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, L3Network l3Network, Map<String, String> userInput, String cloudRegionPo, CreateNetworkResponse createNetworkResponse) throws UnsupportedEncodingException {
156 RollbackNetworkRequest rollbackNetworkRequest = new RollbackNetworkRequest();
158 rollbackNetworkRequest = setCommonRollbackRequestFields(rollbackNetworkRequest, requestContext);
160 NetworkRollback networkRollback = buildNetworkRollback(l3Network, cloudRegion, cloudRegionPo, createNetworkResponse);
161 rollbackNetworkRequest.setNetworkRollback(networkRollback);
163 return rollbackNetworkRequest;
166 public UpdateNetworkRequest createNetworkUpdateRequestMapper(RequestContext requestContext, CloudRegion cloudRegion, OrchestrationContext orchestrationContext, ServiceInstance serviceInstance, L3Network l3Network, Map<String, String> userInput, Customer customer) throws UnsupportedEncodingException {
167 UpdateNetworkRequest updateNetworkRequest = new UpdateNetworkRequest();
169 updateNetworkRequest.setCloudSiteId(cloudRegion.getLcpCloudRegionId());
170 updateNetworkRequest.setTenantId(cloudRegion.getTenantId());
171 updateNetworkRequest.setNetworkId(l3Network.getNetworkId());
172 updateNetworkRequest.setNetworkStackId(l3Network.getHeatStackId());
173 updateNetworkRequest.setNetworkName(l3Network.getNetworkName());
174 updateNetworkRequest.setNetworkType(l3Network.getModelInfoNetwork().getNetworkType());
175 updateNetworkRequest.setNetworkTypeVersion(l3Network.getModelInfoNetwork().getModelVersion());
176 updateNetworkRequest.setModelCustomizationUuid(l3Network.getModelInfoNetwork().getModelCustomizationUUID());
177 updateNetworkRequest.setSubnets(buildOpenstackSubnetList(l3Network));
178 updateNetworkRequest.setProviderVlanNetwork(buildProviderVlanNetwork(l3Network));
179 updateNetworkRequest.setContrailNetwork(buildContrailNetwork(l3Network, customer));
180 updateNetworkRequest.setNetworkParams(addSharedAndExternal(userInput, l3Network));
181 updateNetworkRequest.setMsoRequest(createMsoRequest(requestContext, serviceInstance));
183 setFlowFlags(updateNetworkRequest, orchestrationContext);
185 String messageId = getRandomUuid();
186 updateNetworkRequest.setMessageId(messageId);
187 updateNetworkRequest.setNotificationUrl(createCallbackUrl("NetworkAResponse", messageId));
189 return updateNetworkRequest;
192 private RollbackNetworkRequest setCommonRollbackRequestFields(RollbackNetworkRequest request,RequestContext requestContext) throws UnsupportedEncodingException{
193 request.setSkipAAI(true);
194 String messageId = requestContext.getMsoRequestId();
195 request.setMessageId(messageId);
196 //request.setNotificationUrl(createCallbackUrl("NetworkAResponse", messageId));
200 private NetworkRollback buildNetworkRollback(L3Network l3Network, CloudRegion cloudRegion, String cloudRegionPo, CreateNetworkResponse createNetworkResponse){
201 NetworkRollback networkRollback = new NetworkRollback();
202 networkRollback.setNetworkId(l3Network.getNetworkId());
203 networkRollback.setNeutronNetworkId(createNetworkResponse.getMessageId());
204 networkRollback.setNetworkStackId(createNetworkResponse.getNetworkStackId());
205 networkRollback.setTenantId(cloudRegion.getTenantId());
206 networkRollback.setCloudId(cloudRegionPo);
207 networkRollback.setNetworkType(l3Network.getNetworkType());
208 ModelInfoNetwork modelInfoNetwork = l3Network.getModelInfoNetwork();
209 if (modelInfoNetwork != null){
210 networkRollback.setModelCustomizationUuid(modelInfoNetwork.getModelCustomizationUUID());
212 //rollback will only be called when network was actually created
213 networkRollback.setNetworkCreated(createNetworkResponse.getNetworkCreated());
214 //TODO confirm below not required for create rollback
219 return networkRollback;
222 public MsoRequest createMsoRequest(RequestContext requestContext, ServiceInstance serviceInstance) {
223 MsoRequest msoRequest = new MsoRequest();
224 msoRequest.setRequestId(requestContext.getMsoRequestId());
225 msoRequest.setServiceInstanceId(serviceInstance.getServiceInstanceId());
229 protected String getRandomUuid() {
230 return UUID.randomUUID().toString();
233 protected String createCallbackUrl(String messageType, String correlator) throws UnsupportedEncodingException {
234 String endpoint = this.getEndpoint();
236 while (endpoint.endsWith("/")) {
237 endpoint = endpoint.substring(0, endpoint.length()-1);
239 return endpoint + "/" + UriUtils.encodePathSegment(messageType, "UTF-8") + "/" + UriUtils.encodePathSegment(correlator, "UTF-8");
242 protected String getEndpoint() {
243 return UrnPropertiesReader.getVariable("mso.workflow.message.endpoint");
246 * Use BB L3Network object to build subnets list of type org.onap.so.openstack.beans.Subnet
248 * @return List<org.onap.so.openstack.beans.Subnet>
250 private List<Subnet> buildOpenstackSubnetList(L3Network l3Network){
252 List<org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet> subnets = l3Network.getSubnets();
253 List<org.onap.so.openstack.beans.Subnet> subnetList = new ArrayList<org.onap.so.openstack.beans.Subnet>();
254 //create mapper from onap Subnet to openstack bean Subnet
255 if(modelMapper.getTypeMap(org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet.class, org.onap.so.openstack.beans.Subnet.class) == null) {
256 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>() {
257 protected void configure() {
258 map().setSubnetName(source.getSubnetName());
259 map(source.getSubnetId(), destination.getSubnetId());
260 map(source.getNeutronSubnetId(), destination.getNeutronId());
261 map(source.getGatewayAddress(), destination.getGatewayIp());
262 map(source.getIpVersion(), destination.getIpVersion());
263 map(source.isDhcpEnabled(), destination.getEnableDHCP());
264 map(source.getSubnetSequence(), destination.getSubnetSequence());
267 modelMapper.addMappings(personMap);
270 for (org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet subnet : subnets) {
271 org.onap.so.openstack.beans.Subnet openstackSubnet = modelMapper.map(subnet, org.onap.so.openstack.beans.Subnet.class);
273 if (subnet.getNetworkStartAddress() != null && subnet.getCidrMask() != null)
274 openstackSubnet.setCidr(subnet.getNetworkStartAddress().concat(FORWARD_SLASH).concat(subnet.getCidrMask()));
275 List<org.onap.so.bpmn.servicedecomposition.bbobjects.HostRoute> hostRouteList = subnet.getHostRoutes();
276 List<org.onap.so.openstack.beans.HostRoute> openstackHostRouteList = new ArrayList<>();
277 org.onap.so.openstack.beans.HostRoute openstackHostRoute = new org.onap.so.openstack.beans.HostRoute();
278 //TODO only 2 fields available on openstack object. Confirm it is sufficient or add as needed
279 for (org.onap.so.bpmn.servicedecomposition.bbobjects.HostRoute hostRoute : hostRouteList) {
280 openstackHostRoute.setNextHop(hostRoute.getNextHop());
281 openstackHostRoute.setPrefix(hostRoute.getRoutePrefix());
282 //add host route to the list
283 openstackHostRouteList.add(openstackHostRoute);
285 if (subnet.getDhcpStart() != null && !subnet.getDhcpStart().equals("")) {
286 org.onap.so.openstack.beans.Pool openstackAllocationPool = new org.onap.so.openstack.beans.Pool();
287 openstackAllocationPool.setStart(subnet.getDhcpStart());
288 openstackAllocationPool.setEnd(subnet.getDhcpEnd());
289 List<org.onap.so.openstack.beans.Pool> allocationPools = new ArrayList<>();
290 allocationPools.add(openstackAllocationPool);
291 openstackSubnet.setAllocationPools(allocationPools);
293 openstackSubnet.setHostRoutes(openstackHostRouteList);
294 //add subnet to the list
295 subnetList.add(openstackSubnet);
300 private ProviderVlanNetwork buildProviderVlanNetwork(L3Network l3Network){
301 ProviderVlanNetwork providerVlanNetwork = new ProviderVlanNetwork();
302 providerVlanNetwork.setPhysicalNetworkName(l3Network.getPhysicalNetworkName());
303 List<Integer> vlans = new ArrayList<Integer>();
304 List<org.onap.so.bpmn.servicedecomposition.bbobjects.SegmentationAssignment> segmentationAssignments = l3Network.getSegmentationAssignments();
305 for (org.onap.so.bpmn.servicedecomposition.bbobjects.SegmentationAssignment assignment : segmentationAssignments) {
306 vlans.add(Integer.valueOf(assignment.getSegmentationId()));
308 providerVlanNetwork.setVlans(vlans);
309 return providerVlanNetwork;
312 private ContrailNetwork buildContrailNetwork(L3Network l3Network, Customer customer){
313 ContrailNetwork contrailNetwork = new ContrailNetwork();
314 contrailNetwork.setExternal(Optional.ofNullable(l3Network.isIsExternalNetwork()).orElse(false).toString());
315 contrailNetwork.setShared(Optional.ofNullable(l3Network.isIsSharedNetwork()).orElse(false).toString());
316 contrailNetwork.setPolicyFqdns(buildPolicyFqdns(l3Network.getNetworkPolicies()));
317 contrailNetwork.setRouteTableFqdns(buildRouteTableFqdns(l3Network.getContrailNetworkRouteTableReferences()));
319 contrailNetwork.setRouteTargets(buildRouteTargets(customer.getVpnBindings()));
320 //PolicyFqdns(policyFqdns); --- is set in getAAINetworkPolicy
321 //RouteTableFqdns(routeTableFqdns); --- is set in getAAINetworkTableRef
322 //RouteTargets(routeTargets); --- is set in getAAINetworkVpnBinding
323 return contrailNetwork;
326 private List<String> buildPolicyFqdns(List<NetworkPolicy> networkPolicies) {
327 List<String> policyFqdns = new ArrayList<>();
328 for(NetworkPolicy networkPolicy : networkPolicies) {
329 policyFqdns.add(networkPolicy.getNetworkPolicyFqdn());
334 private List<String> buildRouteTableFqdns(List<RouteTableReference> contrailNetworkRouteTableReferences) {
335 List<String> routeTableFqdns = new ArrayList<>();
336 for(RouteTableReference routeTableReference : contrailNetworkRouteTableReferences) {
337 routeTableFqdns.add(routeTableReference.getRouteTableReferenceFqdn());
339 return routeTableFqdns;
342 private List<RouteTarget> buildRouteTargets(List<VpnBinding> vpnBindings) {
343 if(modelMapper.getTypeMap(org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTarget.class, RouteTarget.class) == null) {
344 modelMapper.addMappings(new PropertyMap<org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTarget, RouteTarget>() {
346 protected void configure() {
347 map().setRouteTarget(source.getGlobalRouteTarget());
348 map().setRouteTargetRole(source.getRouteTargetRole());
353 List<RouteTarget> routeTargets = new ArrayList<>();
354 for(VpnBinding vpnBinding : vpnBindings) {
355 for(org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTarget routeTarget : vpnBinding.getRouteTargets()) {
356 routeTargets.add(modelMapper.map(routeTarget, RouteTarget.class));
362 private CreateNetworkRequest setFlowFlags(CreateNetworkRequest createNetworkRequest, OrchestrationContext orchestrationContext){
363 //TODO confirm flag value
364 createNetworkRequest.setSkipAAI(true);
365 createNetworkRequest.setBackout(Boolean.TRUE.equals(orchestrationContext.getIsRollbackEnabled()));
366 //TODO confirm value - false by default
367 createNetworkRequest.setFailIfExists(true);
368 //NetworkTechnology(NetworkTechnology.NEUTRON); NOOP - default
369 return createNetworkRequest;
372 private void setFlowFlags(UpdateNetworkRequest updateNetworkRequest, OrchestrationContext orchestrationContext){
373 updateNetworkRequest.setSkipAAI(true);
374 updateNetworkRequest.setBackout(Boolean.TRUE.equals(orchestrationContext.getIsRollbackEnabled()));
375 //NetworkTechnology(NetworkTechnology.NEUTRON); NOOP - default
378 private Map<String, String> addSharedAndExternal(Map<String, String> userInput, L3Network l3Network) {
379 if (userInput == null)
380 userInput = new HashMap<String, String>();
381 if (!userInput.containsKey("shared")) {
382 userInput.put("shared", Optional.ofNullable(l3Network.isIsSharedNetwork()).orElse(false).toString());
384 if (!userInput.containsKey("external")) {
385 userInput.put("external", Optional.ofNullable(l3Network.isIsExternalNetwork()).orElse(false).toString());