2 * ============LICENSE_START=======================================================
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
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=========================================================
22 * Copyright (C) 2018 Bell Canada.
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
27 * http://www.apache.org/licenses/LICENSE-2.0
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.
33 package org.onap.so.heatbridge.helpers;
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;
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;
55 * This class provides wrapper methods to manage creation of AAI objects and extracting objects from AAI and
56 * transforming into required objects.
58 public class AaiHelper {
61 * Build vserver relationship object to entities: pserver, vf-module, image, flavor
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
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();
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);
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);
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);
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;
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();
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);
116 return relationshipList;
120 * Transform Openstack Server object to AAI Vserver object
122 * @param serverId Openstack server identifier
123 * @param server Openstack server object
124 * @return AAI Vserver object
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()));
140 * Transform Openstack Image object to AAI Image object
142 * @param image Openstack Image object
143 * @return AAI Image object
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()));
157 * Transform Openstack Flavor object to AAI Flavor object
159 * @param flavor Openstack Flavor object
160 * @return AAI Flavor object
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()));
172 * Extract a list of flavors URI associated with the list of vservers
174 * @param vservers List of vserver AAI objects
175 * @return a list of related flavor related-links
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)));
185 * Extract a list of images URI associated with the list of vservers
187 * @param vservers List of vserver AAI objects
188 * @return a list of related image related-links
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)));
198 * From the list vserver objects build a map of compute hosts's name and the PCI IDs linked to it.
200 * @param vservers List of vserver AAI objects
201 * @return a map of compute names to the PCI ids associated with the compute
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);
221 return pserverToPciIdMap;
225 * Extract from relationship-list object all the relationship-value that match the related-to and relationship-key
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
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());
243 return new ArrayList<>();
247 * Extract and filter the related-links to all objects that match the type specified by the filter property
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
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());
260 return new ArrayList<>();
264 * Build the relationship object
266 * @param relatedTo Related to entity value
267 * @param relationshipKeyValues Key value pairs of relationship data
268 * @return AAI Relationship object
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);