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