2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2019 Nordix Foundation.
4 * ================================================================================
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.so.adapters.vnfmadapter.extclients.aai;
23 import java.util.Collections;
24 import java.util.HashMap;
26 import org.onap.aai.domain.yang.EsrSystemInfo;
27 import org.onap.aai.domain.yang.EsrSystemInfoList;
28 import org.onap.aai.domain.yang.EsrVnfm;
29 import org.onap.aai.domain.yang.EsrVnfmList;
30 import org.onap.aai.domain.yang.GenericVnf;
31 import org.onap.aai.domain.yang.Relationship;
32 import org.onap.aai.domain.yang.RelationshipData;
33 import org.onap.aai.domain.yang.RelationshipList;
34 import org.onap.aai.domain.yang.Vserver;
35 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.LcnVnfLcmOperationOccurrenceNotificationAffectedVnfcs;
36 import org.onap.so.adapters.vnfmadapter.rest.exceptions.TenantNotFoundException;
37 import org.onap.so.adapters.vnfmadapter.rest.exceptions.VnfmNotFoundException;
38 import org.onap.so.client.aai.AAIObjectType;
39 import org.onap.so.client.aai.AAIVersion;
40 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
41 import org.onap.vnfmadapter.v1.model.Tenant;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
44 import org.springframework.beans.factory.annotation.Autowired;
45 import org.springframework.stereotype.Service;
48 * Provides helper methods for interactions with AAI.
51 public class AaiHelper {
53 private static final Logger logger = LoggerFactory.getLogger(AaiHelper.class);
54 private final AaiServiceProvider aaiServiceProvider;
55 private final Map<String, OamIpAddressSource> mapOfVnfIdToOamIpAddressHolder = new HashMap<>();
58 public AaiHelper(final AaiServiceProvider aaiServiceProvider) {
59 this.aaiServiceProvider = aaiServiceProvider;
63 * Add a relationship to the given generic VNF to the given VNFM.
65 * @param vnf the generic VNF
66 * @param vnfmId the ID of the VNFM
68 public void addRelationshipFromGenericVnfToVnfm(final GenericVnf vnf, final String vnfmId) {
69 if (vnf.getRelationshipList() == null) {
70 vnf.setRelationshipList(new RelationshipList());
72 final RelationshipList vnfmRelationshiplist = vnf.getRelationshipList();
73 vnfmRelationshiplist.getRelationship().add(createRelationshipToVnfm(vnfmId));
77 private Relationship createRelationshipToVnfm(final String vnfmId) {
78 final Relationship relationship = new Relationship();
79 relationship.setRelatedTo("esr-vnfm");
80 relationship.setRelationshipLabel("tosca.relationships.DependsOn");
81 relationship.setRelatedLink("/aai/" + AAIVersion.LATEST
82 + AAIUriFactory.createResourceUri(AAIObjectType.VNFM, vnfmId).build().toString());
83 relationship.getRelationshipData().add(createRelationshipData("esr-vnfm.vnfm-id", vnfmId));
87 private RelationshipData createRelationshipData(final String key, final String value) {
88 final RelationshipData data = new RelationshipData();
89 data.setRelationshipKey(key);
90 data.setRelationshipValue(value);
95 * Get the VNFM assigned for use for the given generic VNF.
97 * @param vnf the generic VNF
98 * @return the VNFM to use, or <code>null</code> if no VNFM has been assigned yet
100 public EsrVnfm getAssignedVnfm(final GenericVnf vnf) {
101 final String vnfmId = getIdOfAssignedVnfm(vnf);
102 return vnfmId == null ? null : aaiServiceProvider.invokeGetVnfm(vnfmId);
106 * Get the ID of the VNFM assigned for use for the given generic VNF.
108 * @param vnf the generic VNF
109 * @return the ID of the VNFM to use, or <code>null</code> if no VNFM has been assigned yet
111 public String getIdOfAssignedVnfm(final GenericVnf vnf) {
112 final Relationship relationship = getRelationship(vnf, "esr-vnfm");
113 return getRelationshipKey(relationship, "esr-vnfm.vnfm-id");
117 * Get the tenant assigned for use for the given generic VNF.
119 * @param vnf the generic VNF
120 * @return the tenant to use, or <code>null</code> if no tenant has been assigned yet
122 public Tenant getAssignedTenant(final GenericVnf vnf) {
123 final Relationship relationship = getRelationship(vnf, "tenant");
124 final String cloudOwner = getRelationshipKey(relationship, "cloud-region.cloud-owner");
125 final String cloudRegion = getRelationshipKey(relationship, "cloud-region.cloud-region-id");
126 final String tenantId = getRelationshipKey(relationship, "tenant.tenant-id");
127 if (cloudOwner == null || cloudRegion == null || tenantId == null) {
128 throw new TenantNotFoundException("No matching Tenant found in AAI. VNFID: " + vnf.getVnfId());
130 return new Tenant().cloudOwner(cloudOwner).regionName(cloudRegion).tenantId(tenantId);
134 private Relationship getRelationship(final GenericVnf vnf, final String relationshipRelatedToValue) {
135 for (final Relationship relationship : vnf.getRelationshipList() == null ? Collections.<Relationship>emptyList()
136 : vnf.getRelationshipList().getRelationship()) {
137 if (relationship.getRelatedTo().equals(relationshipRelatedToValue)) {
144 private String getRelationshipKey(final Relationship relationship, final String relationshipKey) {
145 if (relationship != null) {
146 for (final RelationshipData relationshipData : relationship.getRelationshipData()) {
147 if (relationshipData.getRelationshipKey().equals(relationshipKey)) {
148 return relationshipData.getRelationshipValue();
156 * Select a VNFM to use for the given generic VNF. Should only be used when no VNFM has already been assigned to the
159 * @param vnf the generic VNF
160 * @return the VNFM to use
162 public EsrVnfm selectVnfm(final GenericVnf vnf) {
163 final EsrVnfmList vnfmsInEsr = aaiServiceProvider.invokeGetVnfms();
165 if (vnfmsInEsr == null) {
166 throw new VnfmNotFoundException("No VNFMs found in AAI ESR");
168 logger.debug("VNFMs in ESR: " + vnfmsInEsr);
170 for (final EsrVnfm vnfm : vnfmsInEsr.getEsrVnfm()) {
171 if (vnfmHasMatchingEsrSystemInfoType(vnfm, vnf.getNfType())) {
175 throw new VnfmNotFoundException("No matching VNFM found in AAI ESR");
178 private boolean vnfmHasMatchingEsrSystemInfoType(final EsrVnfm vnfm, final String type) {
179 logger.debug("Checking VNFM ID: " + vnfm + ": " + vnfm.getVnfmId());
181 final EsrSystemInfoList systemInfolist = aaiServiceProvider.invokeGetVnfmEsrSystemInfoList(vnfm.getVnfmId());
182 if (systemInfolist != null) {
183 for (final EsrSystemInfo esrSystemInfo : systemInfolist.getEsrSystemInfo()) {
184 if (esrSystemInfo.getType().equals(type)) {
185 logger.debug("Matched VNFM ID: " + vnfm + ", based on type");
196 * @param vnfc the VNFC to base the vserver on
197 * @return the vserver
199 public Vserver createVserver(final LcnVnfLcmOperationOccurrenceNotificationAffectedVnfcs vnfc) {
200 final Vserver vserver = new Vserver();
201 vserver.setVserverId(vnfc.getComputeResource().getResourceId());
202 vserver.setVserverName(vnfc.getId());
203 vserver.setProvStatus("active");
204 vserver.setVserverSelflink("Not available");
209 * Add a relationship to the given vserver to the given VNF.
211 * @param vnf the vserver
212 * @param vnfmId the ID of the VNF
214 public void addRelationshipFromVserverVnfToGenericVnf(final Vserver vserver, final String vnfId) {
215 if (vserver.getRelationshipList() == null) {
216 vserver.setRelationshipList(new RelationshipList());
218 final RelationshipList vserverRelationshiplist = vserver.getRelationshipList();
219 vserverRelationshiplist.getRelationship().add(createRelationshipToGenericVnf(vnfId));
222 private Relationship createRelationshipToGenericVnf(final String vnfId) {
223 final Relationship relationship = new Relationship();
224 relationship.setRelatedTo("generic-vnf");
225 relationship.setRelationshipLabel("tosca.relationships.HostedOn");
226 relationship.setRelatedLink("/aai/" + AAIVersion.LATEST
227 + AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnfId).build().toString());
228 relationship.getRelationshipData().add(createRelationshipData("generic-vnf.vnf-id", vnfId));
232 public void setOamIpAddressSource(final String vnfId, final OamIpAddressSource oamIpAddressSource) {
233 mapOfVnfIdToOamIpAddressHolder.put(vnfId, oamIpAddressSource);
236 public OamIpAddressSource getOamIpAddressSource(final String vnfId) {
237 return mapOfVnfIdToOamIpAddressHolder.get(vnfId);
241 * Add a relationship to the given tenant to the given VNF.
243 * @param vnf the generic vnf
244 * @param tenant the Tenant
247 public void addRelationshipFromGenericVnfToTenant(final GenericVnf vnf, final Tenant tenant) {
248 if (vnf.getRelationshipList() == null) {
249 vnf.setRelationshipList(new RelationshipList());
251 final RelationshipList vnfmRelationshiplist = vnf.getRelationshipList();
252 vnfmRelationshiplist.getRelationship().add(createRelationshipToTenant(tenant));
255 private Relationship createRelationshipToTenant(final Tenant tenant) {
256 final Relationship relationship = new Relationship();
257 relationship.setRelatedTo("tenant");
258 relationship.setRelatedLink("/aai/" + AAIVersion.LATEST + AAIUriFactory.createResourceUri(AAIObjectType.TENANT,
259 tenant.getCloudOwner(), tenant.getRegionName(), tenant.getTenantId()).build().toString());
260 relationship.getRelationshipData()
261 .add(createRelationshipData("cloud-region.cloud-owner", tenant.getCloudOwner()));
262 relationship.getRelationshipData()
263 .add(createRelationshipData("cloud-region.cloud-region-id", tenant.getRegionName()));
264 relationship.getRelationshipData().add(createRelationshipData("tenant.tenant-id", tenant.getTenantId()));