Merge Casablanca
[so.git] / bpmn / so-bpmn-tasks / src / main / java / org / onap / so / bpmn / infrastructure / aai / tasks / AAIQueryTasks.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.bpmn.infrastructure.aai.tasks;
22
23 import java.util.ArrayList;
24 import java.util.List;
25 import java.util.Optional;
26
27 import org.modelmapper.ModelMapper;
28 import org.modelmapper.PropertyMap;
29 import org.onap.aai.domain.yang.NetworkPolicy;
30 import org.onap.aai.domain.yang.RouteTableReference;
31 import org.onap.aai.domain.yang.RouteTargets;
32 import org.onap.aai.domain.yang.Subnet;
33 import org.onap.aai.domain.yang.VpnBinding;
34 import org.onap.so.adapters.nwrest.CreateNetworkRequest;
35 import org.onap.so.bpmn.common.BuildingBlockExecution;
36 import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network;
37 import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
38 import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
39 import org.onap.so.client.aai.AAIObjectType;
40 import org.onap.so.client.aai.entities.AAIResultWrapper;
41 import org.onap.so.client.aai.entities.Relationships;
42 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
43 import org.onap.so.client.exception.ExceptionBuilder;
44 import org.onap.so.client.orchestration.AAINetworkResources;
45 import org.onap.so.logger.MsoLogger;
46 import org.springframework.beans.factory.annotation.Autowired;
47 import org.springframework.stereotype.Component;
48
49 @Component
50 public class AAIQueryTasks {
51
52         private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, AAIQueryTasks.class);
53         private static final String ERROR_MSG = "No relationships were returned from AAIResultWrapper.getRelationships()";
54         @Autowired
55         private ExtractPojosForBB extractPojosForBB;
56         @Autowired
57         private ExceptionBuilder exceptionUtil;
58         @Autowired
59         private AAINetworkResources aaiNetworkResources;
60         private static final ModelMapper modelMapper = new ModelMapper();
61         
62         /** 
63          * BPMN access method to query data for VPN bindings from the AAI result wrapper.
64          * The resulting VPN bindings are mapped to the corresponding bbobject and placed in the customer bbobject
65          * 
66          * @param execution
67          */
68
69         public void queryNetworkVpnBinding(BuildingBlockExecution execution) {
70                 try {
71                         L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID,
72                                         execution.getLookupMap().get(ResourceKey.NETWORK_ID));
73                         AAIResultWrapper aaiResultWrapper = aaiNetworkResources.queryNetworkWrapperById(l3network);
74                         Optional<Relationships> networkRelationships = aaiResultWrapper.getRelationships();
75                         if (!networkRelationships.isPresent()) {
76                                 throw (new Exception(ERROR_MSG));
77                         }
78                         List<AAIResourceUri> netBindingsUriList = networkRelationships.get().getRelatedAAIUris(AAIObjectType.VPN_BINDING);
79                         
80                         List<org.onap.so.bpmn.servicedecomposition.bbobjects.VpnBinding> mappedVpnBindings = new ArrayList<>();
81                         if(netBindingsUriList != null && !netBindingsUriList.isEmpty()) {
82                                 for(AAIResourceUri netBindingUri : netBindingsUriList) {
83                                         Optional<VpnBinding> oVpnBinding = aaiNetworkResources.getVpnBinding(netBindingUri);
84                                         if(oVpnBinding.isPresent()) {
85                                                 org.onap.so.bpmn.servicedecomposition.bbobjects.VpnBinding mappedVpnBinding = 
86                                                                 modelMapper.map(oVpnBinding.get(), org.onap.so.bpmn.servicedecomposition.bbobjects.VpnBinding.class);
87                                                 if (oVpnBinding.get().getRouteTargets() != null){
88                                                         mappedVpnBinding.getRouteTargets().addAll(mapRouteTargets(oVpnBinding.get().getRouteTargets().getRouteTarget()));
89                                                         mappedVpnBindings.add(mappedVpnBinding);
90                                                 }
91                                         }
92                                 }
93                         }
94                         execution.getGeneralBuildingBlock().getCustomer().getVpnBindings().addAll(mappedVpnBindings);
95                 } catch(Exception ex) {
96                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
97                 }
98         }
99
100         /**
101          * BPMN access method to extract VPN Binding data from AAI result and populate proper fields into CreateNetworkRequest
102          */
103         public void getNetworkVpnBinding(BuildingBlockExecution execution) {
104
105                 try {
106                         L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID,
107                                         execution.getLookupMap().get(ResourceKey.NETWORK_ID));
108                         AAIResultWrapper aaiResultWrapper = aaiNetworkResources.queryNetworkWrapperById(l3network);
109                         CreateNetworkRequest createNetworkRequest = execution.getVariable("createNetworkRequest");
110
111                         Optional<Relationships> networkRelationships = aaiResultWrapper.getRelationships();
112                         if (!networkRelationships.isPresent()) {
113                                 throw (new Exception(ERROR_MSG));
114                         }
115                         List<AAIResourceUri> netBindingsUriList = networkRelationships.get()
116                                         .getRelatedAAIUris(AAIObjectType.VPN_BINDING);
117                         List<org.onap.so.openstack.beans.RouteTarget> routeTargets = new ArrayList<>();
118                         for (AAIResourceUri netBindingUri : netBindingsUriList) {
119                                 msoLogger.info("Get Route Targests");
120                                 Optional<VpnBinding> oVpnBinding = aaiNetworkResources.getVpnBinding(netBindingUri);
121                                 if (oVpnBinding.isPresent()) {
122                                         VpnBinding vpnBinding = oVpnBinding.get();
123                                         RouteTargets rts = vpnBinding.getRouteTargets();
124                                         if (rts != null) {
125                                                 List<org.onap.aai.domain.yang.RouteTarget> rtList = rts.getRouteTarget();
126                                                 if (!rtList.isEmpty()) {
127                                                         PropertyMap<org.onap.aai.domain.yang.RouteTarget, org.onap.so.openstack.beans.RouteTarget> personMap = new PropertyMap<org.onap.aai.domain.yang.RouteTarget, org.onap.so.openstack.beans.RouteTarget>() {
128                                                                 @Override
129                                                                 protected void configure() {
130                                                                         map().setRouteTarget(source.getGlobalRouteTarget());
131                                                                         map(source.getRouteTargetRole(), destination.getRouteTargetRole());
132                                                                 }
133                                                         };
134                                                         modelMapper.addMappings(personMap);
135                                                         for (org.onap.aai.domain.yang.RouteTarget rt : rtList) {
136                                                                 org.onap.so.openstack.beans.RouteTarget openstackRtBean = modelMapper.map(rt,
137                                                                                 org.onap.so.openstack.beans.RouteTarget.class);
138                                                                 routeTargets.add(openstackRtBean);
139                                                         }
140                                                 }
141                                         }
142                                 }
143                         }
144                         // store route targets data in execution - to be used as part of
145                         // Network adapter input
146                         createNetworkRequest.getContrailNetwork().setRouteTargets(routeTargets);
147                         execution.setVariable("createNetworkRequest", createNetworkRequest);
148                 } catch (Exception ex) {
149                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
150                 }
151         }
152         
153         /**
154          * BPMN access method to query data for network policies from the AAI result wrapper
155          * From the resulting network policy, the network policy fqdn parameter is added to 
156          * the network bbobject contrail network policy fqdns list
157          * 
158          * @param execution
159          */
160         public void queryNetworkPolicy(BuildingBlockExecution execution) {
161                 try {
162                         L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID,
163                                         execution.getLookupMap().get(ResourceKey.NETWORK_ID));
164                         AAIResultWrapper aaiResultWrapper = aaiNetworkResources.queryNetworkWrapperById(l3network);
165                         Optional<Relationships> networkRelationships = aaiResultWrapper.getRelationships();
166                         if (!networkRelationships.isPresent()) {
167                                 throw (new Exception(ERROR_MSG));
168                         }
169                         List<AAIResourceUri> netPoliciesUriList = networkRelationships.get().getRelatedAAIUris(AAIObjectType.NETWORK_POLICY);
170                         
171                         if(!netPoliciesUriList.isEmpty()) {
172                                 for(AAIResourceUri netPolicyUri : netPoliciesUriList) {
173                                         Optional<NetworkPolicy> oNetPolicy = aaiNetworkResources.getNetworkPolicy(netPolicyUri);
174                                         if(oNetPolicy.isPresent()) {
175                                                 l3network.getNetworkPolicies().add(modelMapper.map(oNetPolicy.get(), org.onap.so.bpmn.servicedecomposition.bbobjects.NetworkPolicy.class));
176                                         }
177                                 }
178                         }
179                 } catch(Exception ex) {
180                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
181                 }
182         }
183         
184         /**
185          * BPMN access method to query data for network table ref from the AAI result wrapper
186          * The resulting route table reference is mapped to the corresponding bbobject and added 
187          * to the network bbobject contrail network route table references list
188          * 
189          * @param execution
190          */
191         public void queryNetworkTableRef(BuildingBlockExecution execution) {
192                 try {
193                         L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID,
194                                         execution.getLookupMap().get(ResourceKey.NETWORK_ID));
195                         AAIResultWrapper aaiResultWrapper = aaiNetworkResources.queryNetworkWrapperById(l3network);
196                         Optional<Relationships> networkRelationships = aaiResultWrapper.getRelationships();
197                         if (!networkRelationships.isPresent()) {
198                                 throw (new Exception(ERROR_MSG));
199                         }
200                         List<AAIResourceUri> routeTableUriList = networkRelationships.get().getRelatedAAIUris(AAIObjectType.ROUTE_TABLE_REFERENCE);
201                         
202                         if(!routeTableUriList.isEmpty()) {
203                                 for(AAIResourceUri routeTableUri : routeTableUriList) {
204                                         Optional<RouteTableReference> oRouteTableReference = aaiNetworkResources.getRouteTable(routeTableUri);
205                                         if(oRouteTableReference.isPresent()) {
206                                                 org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTableReference mappedRouteTableReference = modelMapper.map(oRouteTableReference.get(), org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTableReference.class);
207                                                 l3network.getContrailNetworkRouteTableReferences().add(mappedRouteTableReference);
208                                         }
209                                 }
210                         }
211                 } catch(Exception ex) {
212                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
213                 }
214         }
215         
216         private List<org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTarget> mapRouteTargets(List<org.onap.aai.domain.yang.RouteTarget> routeTargets) {
217                 List<org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTarget> mappedRouteTargets = new ArrayList<>();
218                 if(!routeTargets.isEmpty()) {
219                         for(org.onap.aai.domain.yang.RouteTarget routeTarget : routeTargets) {
220                                 org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTarget mappedRouteTarget = modelMapper.map(routeTarget, org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTarget.class);
221                                 mappedRouteTargets.add(mappedRouteTarget);
222                         }
223                 }
224                 return mappedRouteTargets;
225         }
226         
227         public void querySubnet(BuildingBlockExecution execution) {
228                 try {
229                         L3Network l3network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID,
230                                         execution.getLookupMap().get(ResourceKey.NETWORK_ID));
231                         AAIResultWrapper aaiResultWrapper = aaiNetworkResources.queryNetworkWrapperById(l3network);
232                         Optional<Relationships> networkRelationships = aaiResultWrapper.getRelationships();
233                         if (!networkRelationships.isPresent()) {
234                                 throw (new Exception(ERROR_MSG));
235                         }
236                         List<AAIResourceUri> subnetsUriList = networkRelationships.get().getRelatedAAIUris(AAIObjectType.SUBNET);
237                         
238                         if(!subnetsUriList.isEmpty()) {
239                                 for(AAIResourceUri subnetUri : subnetsUriList) {
240                                         Optional<Subnet> oSubnet = aaiNetworkResources.getSubnet(subnetUri);
241                                         if(oSubnet.isPresent()) {
242                                                 l3network.getSubnets().add(modelMapper.map(oSubnet.get(), org.onap.so.bpmn.servicedecomposition.bbobjects.Subnet.class));
243                                         }
244                                 }
245                         }
246                 } catch(Exception ex) {
247                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
248                 }
249         }
250 }