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