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.List;
27 import java.util.UUID;
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;
51 public class NetworkAdapterObjectMapper {
52 private static final ModelMapper modelMapper = new ModelMapper();
53 private static String FORWARD_SLASH = "/";
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();
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());
71 //build and set Subnet list
72 createNetworkRequest.setSubnets(buildOpenstackSubnetList(l3Network));
74 //build and set provider Vlan Network
75 ProviderVlanNetwork providerVlanNetwork = buildProviderVlanNetwork(l3Network);
76 createNetworkRequest.setProviderVlanNetwork(providerVlanNetwork);
78 //build and set Contrail Network
79 ContrailNetwork contrailNetwork = buildContrailNetwork(l3Network, customer);
80 createNetworkRequest.setContrailNetwork(contrailNetwork);
82 //set Network Parameters from VID request
83 createNetworkRequest.setNetworkParams(userInput);
85 createNetworkRequest = setFlowFlags(createNetworkRequest, orchestrationContext);
87 createNetworkRequest.setMsoRequest(createMsoRequest(requestContext, serviceInstance));
89 String messageId = getRandomUuid();
90 createNetworkRequest.setMessageId(messageId);
91 //TODO clarify callback URL build process
92 //createNetworkRequest.setNotificationUrl(createCallbackUrl("NetworkAResponse", messageId));
94 return createNetworkRequest;
97 public DeleteNetworkRequest deleteNetworkRequestMapper(RequestContext requestContext, CloudRegion cloudRegion, ServiceInstance serviceInstance, L3Network l3Network) throws UnsupportedEncodingException {
98 DeleteNetworkRequest deleteNetworkRequest = new DeleteNetworkRequest();
100 deleteNetworkRequest.setCloudSiteId(cloudRegion.getLcpCloudRegionId());
102 String messageId = getRandomUuid();
103 deleteNetworkRequest.setMessageId(messageId);
105 ModelInfoNetwork modelInfoNetwork = l3Network.getModelInfoNetwork();
106 if (modelInfoNetwork != null){
107 deleteNetworkRequest.setModelCustomizationUuid(modelInfoNetwork.getModelCustomizationUUID());
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());
117 return deleteNetworkRequest;
121 * Access method to build Rollback Network Request
123 * @throws UnsupportedEncodingException
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();
128 rollbackNetworkRequest = setCommonRollbackRequestFields(rollbackNetworkRequest, requestContext);
130 NetworkRollback networkRollback = buildNetworkRollback(l3Network, cloudRegion, cloudRegionPo, createNetworkResponse);
131 rollbackNetworkRequest.setNetworkRollback(networkRollback);
133 return rollbackNetworkRequest;
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();
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));
153 setFlowFlags(updateNetworkRequest, orchestrationContext);
155 String messageId = getRandomUuid();
156 updateNetworkRequest.setMessageId(messageId);
157 updateNetworkRequest.setNotificationUrl(createCallbackUrl("NetworkAResponse", messageId));
159 return updateNetworkRequest;
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));
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());
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
190 return networkRollback;
193 public MsoRequest createMsoRequest(RequestContext requestContext, ServiceInstance serviceInstance) {
194 MsoRequest msoRequest = new MsoRequest();
195 msoRequest.setRequestId(requestContext.getMsoRequestId());
196 msoRequest.setServiceInstanceId(serviceInstance.getServiceInstanceId());
200 protected String getRandomUuid() {
201 return UUID.randomUUID().toString();
204 protected String createCallbackUrl(String messageType, String correlator) throws UnsupportedEncodingException {
205 String endpoint = this.getEndpoint();
207 while (endpoint.endsWith("/")) {
208 endpoint = endpoint.substring(0, endpoint.length()-1);
210 return endpoint + "/" + UriUtils.encodePathSegment(messageType, "UTF-8") + "/" + UriUtils.encodePathSegment(correlator, "UTF-8");
213 protected String getEndpoint() {
214 return UrnPropertiesReader.getVariable("mso.workflow.message.endpoint");
217 * Use BB L3Network object to build subnets list of type org.onap.so.openstack.beans.Subnet
219 * @return List<org.onap.so.openstack.beans.Subnet>
221 private List<Subnet> buildOpenstackSubnetList(L3Network l3Network){
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());
237 modelMapper.addMappings(personMap);
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);
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);
255 openstackSubnet.setHostRoutes(openstackHostRouteList);
256 //add subnet to the list
257 subnetList.add(openstackSubnet);
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()));
270 providerVlanNetwork.setVlans(vlans);
271 return providerVlanNetwork;
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()));
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;
288 private List<String> buildPolicyFqdns(List<NetworkPolicy> networkPolicies) {
289 List<String> policyFqdns = new ArrayList<>();
290 for(NetworkPolicy networkPolicy : networkPolicies) {
291 policyFqdns.add(networkPolicy.getNetworkPolicyFqdn());
296 private List<String> buildRouteTableFqdns(List<RouteTableReference> contrailNetworkRouteTableReferences) {
297 List<String> routeTableFqdns = new ArrayList<>();
298 for(RouteTableReference routeTableReference : contrailNetworkRouteTableReferences) {
299 routeTableFqdns.add(routeTableReference.getRouteTableReferenceFqdn());
301 return routeTableFqdns;
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>() {
308 protected void configure() {
309 map().setRouteTarget(source.getGlobalRouteTarget());
310 map().setRouteTargetRole(source.getRouteTargetRole());
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));
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;
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