Merge "Added null check for execute() result to remove static analyzer warning"
[so.git] / adapters / mso-openstack-adapters / src / main / java / org / onap / so / heatbridge / helpers / AaiHelper.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 - 2019 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 /*
22  * Copyright (C) 2018 Bell Canada.
23  *
24  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
25  * the License. You may obtain a copy of the License at
26  *
27  * http://www.apache.org/licenses/LICENSE-2.0
28  *
29  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
30  * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
31  * specific language governing permissions and limitations under the License.
32  */
33 package org.onap.so.heatbridge.helpers;
34
35 import com.google.common.base.Preconditions;
36 import com.google.common.collect.ImmutableMap;
37 import java.util.ArrayList;
38 import java.util.Collection;
39 import java.util.HashMap;
40 import java.util.List;
41 import java.util.Map;
42 import java.util.stream.Collectors;
43 import org.apache.commons.collections.CollectionUtils;
44 import org.onap.aai.domain.yang.Flavor;
45 import org.onap.aai.domain.yang.Image;
46 import org.onap.aai.domain.yang.Relationship;
47 import org.onap.aai.domain.yang.RelationshipData;
48 import org.onap.aai.domain.yang.RelationshipList;
49 import org.onap.aai.domain.yang.SriovVf;
50 import org.onap.aai.domain.yang.Vserver;
51 import org.onap.so.heatbridge.constants.HeatBridgeConstants;
52 import org.openstack4j.model.compute.Server;
53
54 /**
55  * This class provides wrapper methods to manage creation of AAI objects and extracting objects from AAI and
56  * transforming into required objects.
57  */
58 public class AaiHelper {
59
60     /**
61      * Build vserver relationship object to entities: pserver, vf-module, image, flavor
62      *
63      * @param cloudOwner AAI cloudOwner value
64      * @param cloudRegionId AAI cloud-region identifier
65      * @param genericVnfId AAI generic-vnf identifier
66      * @param vfModuleId AAI vf-module identifier
67      * @param server Openstack Server object
68      */
69     public RelationshipList getVserverRelationshipList(final String cloudOwner, final String cloudRegionId,
70             final String genericVnfId, final String vfModuleId, final Server server) {
71         RelationshipList relationshipList = new RelationshipList();
72         List<Relationship> relationships = relationshipList.getRelationship();
73
74         // vserver to pserver relationship
75         Relationship pserverRelationship =
76                 buildRelationship(HeatBridgeConstants.AAI_PSERVER, ImmutableMap.<String, String>builder()
77                         .put(HeatBridgeConstants.AAI_PSERVER_HOSTNAME, server.getHypervisorHostname()).build());
78         relationships.add(pserverRelationship);
79
80         // vserver to vf-module relationship
81         Relationship vfModuleRelationship = buildRelationship(HeatBridgeConstants.AAI_VF_MODULE,
82                 ImmutableMap.<String, String>builder().put(HeatBridgeConstants.AAI_GENERIC_VNF_ID, genericVnfId)
83                         .put(HeatBridgeConstants.AAI_VF_MODULE_ID, vfModuleId).build());
84         relationships.add(vfModuleRelationship);
85
86         // vserver to image relationship
87         if (server.getImage() != null) {
88             Relationship imageRel = buildRelationship(HeatBridgeConstants.AAI_IMAGE,
89                     ImmutableMap.<String, String>builder().put(HeatBridgeConstants.AAI_CLOUD_OWNER, cloudOwner)
90                             .put(HeatBridgeConstants.AAI_CLOUD_REGION_ID, cloudRegionId)
91                             .put(HeatBridgeConstants.AAI_IMAGE_ID, server.getImage().getId()).build());
92             relationships.add(imageRel);
93         }
94
95         // vserver to flavor relationship
96         Relationship flavorRel = buildRelationship(HeatBridgeConstants.AAI_FLAVOR,
97                 ImmutableMap.<String, String>builder().put(HeatBridgeConstants.AAI_CLOUD_OWNER, cloudOwner)
98                         .put(HeatBridgeConstants.AAI_CLOUD_REGION_ID, cloudRegionId)
99                         .put(HeatBridgeConstants.AAI_FLAVOR_ID, server.getFlavor().getId()).build());
100         relationships.add(flavorRel);
101         return relationshipList;
102     }
103
104     public RelationshipList getLInterfaceRelationshipList(final String pserverName, final String pIfName,
105             final String pfPciId) {
106         RelationshipList relationshipList = new RelationshipList();
107         List<Relationship> relationships = relationshipList.getRelationship();
108
109         // sriov-vf to sriov-pf relationship
110         Relationship sriovPfRelationship = buildRelationship(HeatBridgeConstants.AAI_SRIOV_PF,
111                 ImmutableMap.<String, String>builder().put(HeatBridgeConstants.AAI_PSERVER_HOSTNAME, pserverName)
112                         .put(HeatBridgeConstants.AAI_P_INTERFACE_NAME, pIfName)
113                         .put(HeatBridgeConstants.AAI_SRIOV_PF_PCI_ID, pfPciId).build());
114         relationships.add(sriovPfRelationship);
115
116         return relationshipList;
117     }
118
119     /**
120      * Transform Openstack Server object to AAI Vserver object
121      *
122      * @param serverId Openstack server identifier
123      * @param server Openstack server object
124      * @return AAI Vserver object
125      */
126     public Vserver buildVserver(final String serverId, final Server server) {
127         Vserver vserver = new Vserver();
128         vserver.setInMaint(false);
129         vserver.setIsClosedLoopDisabled(false);
130         vserver.setVserverId(serverId);
131         vserver.setVserverName(server.getName());
132         vserver.setVserverName2(server.getName());
133         vserver.setProvStatus(server.getStatus().value());
134         server.getLinks().stream().filter(link -> link.getRel().equals(HeatBridgeConstants.OS_RESOURCES_SELF_LINK_KEY))
135                 .findFirst().ifPresent(link -> vserver.setVserverSelflink(link.getHref()));
136         return vserver;
137     }
138
139     /**
140      * Transform Openstack Image object to AAI Image object
141      *
142      * @param image Openstack Image object
143      * @return AAI Image object
144      */
145     public Image buildImage(final org.openstack4j.model.compute.Image image) {
146         Image aaiImage = new Image();
147         aaiImage.setImageId(image.getId());
148         aaiImage.setImageName(image.getName());
149         aaiImage.setImageOsDistro(HeatBridgeConstants.OS_UNKNOWN_KEY);
150         aaiImage.setImageOsVersion(HeatBridgeConstants.OS_UNKNOWN_KEY);
151         image.getLinks().stream().filter(link -> link.getRel().equals(HeatBridgeConstants.OS_RESOURCES_SELF_LINK_KEY))
152                 .findFirst().ifPresent(link -> aaiImage.setImageSelflink(link.getHref()));
153         return aaiImage;
154     }
155
156     /**
157      * Transform Openstack Flavor object to AAI Flavor object
158      *
159      * @param flavor Openstack Flavor object
160      * @return AAI Flavor object
161      */
162     public Flavor buildFlavor(final org.openstack4j.model.compute.Flavor flavor) {
163         Flavor aaiFlavor = new Flavor();
164         aaiFlavor.setFlavorId(flavor.getId());
165         aaiFlavor.setFlavorName(flavor.getName());
166         flavor.getLinks().stream().filter(link -> link.getRel().equals(HeatBridgeConstants.OS_RESOURCES_SELF_LINK_KEY))
167                 .findFirst().ifPresent(link -> aaiFlavor.setFlavorSelflink(link.getHref()));
168         return aaiFlavor;
169     }
170
171     /**
172      * Extract a list of flavors URI associated with the list of vservers
173      *
174      * @param vservers List of vserver AAI objects
175      * @return a list of related flavor related-links
176      */
177     public List<String> getFlavorsUriFromVserver(final List<Vserver> vservers) {
178         List<String> flavorUris = new ArrayList<>();
179         vservers.forEach(vserver -> flavorUris.addAll(
180                 filterRelatedLinksByRelatedToProperty(vserver.getRelationshipList(), HeatBridgeConstants.AAI_FLAVOR)));
181         return flavorUris;
182     }
183
184     /**
185      * Extract a list of images URI associated with the list of vservers
186      *
187      * @param vservers List of vserver AAI objects
188      * @return a list of related image related-links
189      */
190     public List<String> getImagesUriFromVserver(final List<Vserver> vservers) {
191         List<String> imageUris = new ArrayList<>();
192         vservers.forEach(vserver -> imageUris.addAll(
193                 filterRelatedLinksByRelatedToProperty(vserver.getRelationshipList(), HeatBridgeConstants.AAI_IMAGE)));
194         return imageUris;
195     }
196
197     /**
198      * From the list vserver objects build a map of compute hosts's name and the PCI IDs linked to it.
199      *
200      * @param vservers List of vserver AAI objects
201      * @return a map of compute names to the PCI ids associated with the compute
202      */
203     public Map<String, List<String>> getPserverToPciIdMap(final List<Vserver> vservers) {
204         Map<String, List<String>> pserverToPciIdMap = new HashMap<>();
205         for (Vserver vserver : vservers) {
206             if (vserver.getLInterfaces() != null) {
207                 List<String> pciIds = vserver.getLInterfaces().getLInterface().stream()
208                         .filter(lInterface -> lInterface.getSriovVfs() != null
209                                 && CollectionUtils.isNotEmpty(lInterface.getSriovVfs().getSriovVf()))
210                         .flatMap(lInterface -> lInterface.getSriovVfs().getSriovVf().stream()).map(SriovVf::getPciId)
211                         .collect(Collectors.toList());
212                 if (CollectionUtils.isNotEmpty(pciIds)) {
213                     List<String> matchingPservers = extractRelationshipDataValue(vserver.getRelationshipList(),
214                             HeatBridgeConstants.AAI_PSERVER, HeatBridgeConstants.AAI_PSERVER_HOSTNAME);
215                     Preconditions.checkState(matchingPservers != null && matchingPservers.size() == 1,
216                             "Invalid pserver relationships for vserver: " + vserver.getVserverName());
217                     pserverToPciIdMap.put(matchingPservers.get(0), pciIds);
218                 }
219             }
220         }
221         return pserverToPciIdMap;
222     }
223
224     /**
225      * Extract from relationship-list object all the relationship-value that match the related-to and relationship-key
226      * fields.
227      *
228      * @param relationshipListObj AAI relationship-list object
229      * @param relatedToProperty related-to value
230      * @param relationshipKey relationship-key value
231      * @return relationship-value matching the key requested for the relationship object of type related-to property
232      */
233     private List<String> extractRelationshipDataValue(final RelationshipList relationshipListObj,
234             final String relatedToProperty, final String relationshipKey) {
235         if (relationshipListObj != null && relationshipListObj.getRelationship() != null) {
236             return relationshipListObj.getRelationship().stream()
237                     .filter(relationship -> relationship.getRelatedTo().equals(relatedToProperty))
238                     .map(Relationship::getRelationshipData).flatMap(Collection::stream)
239                     .filter(data -> data.getRelationshipKey() != null
240                             && relationshipKey.equals(data.getRelationshipKey()))
241                     .map(RelationshipData::getRelationshipValue).collect(Collectors.toList());
242         }
243         return new ArrayList<>();
244     }
245
246     /**
247      * Extract and filter the related-links to all objects that match the type specified by the filter property
248      *
249      * @param relationshipListObj AAI object representing relationship object
250      * @param relatedToProperty Value identifying the type of AAI object for related-to field
251      * @return a list of related-links filtered by the specified related-to property
252      */
253     private List<String> filterRelatedLinksByRelatedToProperty(final RelationshipList relationshipListObj,
254             final String relatedToProperty) {
255         if (relationshipListObj != null && relationshipListObj.getRelationship() != null) {
256             return relationshipListObj.getRelationship().stream()
257                     .filter(relationship -> relationship.getRelatedTo().equals(relatedToProperty))
258                     .map(Relationship::getRelatedLink).collect(Collectors.toList());
259         }
260         return new ArrayList<>();
261     }
262
263     /**
264      * Build the relationship object
265      *
266      * @param relatedTo Related to entity value
267      * @param relationshipKeyValues Key value pairs of relationship data
268      * @return AAI Relationship object
269      */
270     private Relationship buildRelationship(final String relatedTo, final Map<String, String> relationshipKeyValues) {
271         Relationship relationship = new Relationship();
272         relationship.setRelatedTo(relatedTo);
273         relationshipKeyValues.keySet().forEach(k -> {
274             RelationshipData relationshipData = new RelationshipData();
275             relationshipData.setRelationshipKey(k);
276             relationshipData.setRelationshipValue(relationshipKeyValues.get(k));
277             relationship.getRelationshipData().add(relationshipData);
278         });
279         return relationship;
280     }
281 }