Calls to/from VNFM fail
[so.git] / adapters / mso-vnfm-adapter / mso-vnfm-etsi-adapter / src / main / java / org / onap / so / adapters / vnfmadapter / extclients / aai / AaiHelper.java
index 893df02..110bbab 100644 (file)
@@ -21,6 +21,9 @@
 package org.onap.so.adapters.vnfmadapter.extclients.aai;
 
 import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
 import org.onap.aai.domain.yang.EsrSystemInfo;
 import org.onap.aai.domain.yang.EsrSystemInfoList;
 import org.onap.aai.domain.yang.EsrVnfm;
@@ -29,11 +32,14 @@ import org.onap.aai.domain.yang.GenericVnf;
 import org.onap.aai.domain.yang.Relationship;
 import org.onap.aai.domain.yang.RelationshipData;
 import org.onap.aai.domain.yang.RelationshipList;
-import org.onap.aai.domain.yang.Tenant;
+import org.onap.aai.domain.yang.Vserver;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.LcnVnfLcmOperationOccurrenceNotificationAffectedVnfcs;
+import org.onap.so.adapters.vnfmadapter.rest.exceptions.TenantNotFoundException;
 import org.onap.so.adapters.vnfmadapter.rest.exceptions.VnfmNotFoundException;
 import org.onap.so.client.aai.AAIObjectType;
 import org.onap.so.client.aai.AAIVersion;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
+import org.onap.vnfmadapter.v1.model.Tenant;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -47,6 +53,7 @@ public class AaiHelper {
 
     private static final Logger logger = LoggerFactory.getLogger(AaiHelper.class);
     private final AaiServiceProvider aaiServiceProvider;
+    private final Map<String, OamIpAddressSource> mapOfVnfIdToOamIpAddressHolder = new HashMap<>();
 
     @Autowired
     public AaiHelper(final AaiServiceProvider aaiServiceProvider) {
@@ -66,7 +73,6 @@ public class AaiHelper {
         final RelationshipList vnfmRelationshiplist = vnf.getRelationshipList();
         vnfmRelationshiplist.getRelationship().add(createRelationshipToVnfm(vnfmId));
 
-        aaiServiceProvider.invokePutGenericVnf(vnf);
     }
 
     private Relationship createRelationshipToVnfm(final String vnfmId) {
@@ -93,11 +99,21 @@ public class AaiHelper {
      * @return the VNFM to use, or <code>null</code> if no VNFM has been assigned yet
      */
     public EsrVnfm getAssignedVnfm(final GenericVnf vnf) {
-        final Relationship relationship = getRelationship(vnf, "esr-vnfm");
-        final String vnfmId = getRelationshipKey(relationship, "esr-vnfm.vnfm-id");
+        final String vnfmId = getIdOfAssignedVnfm(vnf);
         return vnfmId == null ? null : aaiServiceProvider.invokeGetVnfm(vnfmId);
     }
 
+    /**
+     * Get the ID of the VNFM assigned for use for the given generic VNF.
+     *
+     * @param vnf the generic VNF
+     * @return the ID of the VNFM to use, or <code>null</code> if no VNFM has been assigned yet
+     */
+    public String getIdOfAssignedVnfm(final GenericVnf vnf) {
+        final Relationship relationship = getRelationship(vnf, "esr-vnfm");
+        return getRelationshipData(relationship, "esr-vnfm.vnfm-id");
+    }
+
     /**
      * Get the tenant assigned for use for the given generic VNF.
      *
@@ -106,11 +122,14 @@ public class AaiHelper {
      */
     public Tenant getAssignedTenant(final GenericVnf vnf) {
         final Relationship relationship = getRelationship(vnf, "tenant");
-        final String cloudOwner = getRelationshipKey(relationship, "cloud-region.cloud-owner");
-        final String cloudRegion = getRelationshipKey(relationship, "cloud-region.cloud-region-id");
-        final String tenantId = getRelationshipKey(relationship, "tenant.tenant-id");
-        return cloudOwner == null || cloudRegion == null || tenantId == null ? null
-                : aaiServiceProvider.invokeGetTenant(cloudOwner, cloudRegion, tenantId);
+        final String cloudOwner = getRelationshipData(relationship, "cloud-region.cloud-owner");
+        final String cloudRegion = getRelationshipData(relationship, "cloud-region.cloud-region-id");
+        final String tenantId = getRelationshipData(relationship, "tenant.tenant-id");
+        if (cloudOwner == null || cloudRegion == null || tenantId == null) {
+            throw new TenantNotFoundException("No matching Tenant found in AAI. VNFID: " + vnf.getVnfId());
+        } else {
+            return new Tenant().cloudOwner(cloudOwner).regionName(cloudRegion).tenantId(tenantId);
+        }
     }
 
     private Relationship getRelationship(final GenericVnf vnf, final String relationshipRelatedToValue) {
@@ -123,10 +142,17 @@ public class AaiHelper {
         return null;
     }
 
-    private String getRelationshipKey(final Relationship relationship, final String relationshipKey) {
+    /**
+     * Get the value of the relationship data with the given key in the given relationship.
+     *
+     * @param relationship the relationship
+     * @param relationshipDataKey the key for the relationship data
+     * @return the value of the relationship data for the given key
+     */
+    public String getRelationshipData(final Relationship relationship, final String relationshipDataKey) {
         if (relationship != null) {
             for (final RelationshipData relationshipData : relationship.getRelationshipData()) {
-                if (relationshipData.getRelationshipKey().equals(relationshipKey)) {
+                if (relationshipData.getRelationshipKey().equals(relationshipDataKey)) {
                     return relationshipData.getRelationshipValue();
                 }
             }
@@ -135,8 +161,34 @@ public class AaiHelper {
     }
 
     /**
-     * Select a VNFM to use for the given generic VNF. Should only be used when no VNFM has already been
-     * assigned to the VNF.
+     * Delete from the given VNF the relationship matching the given criteria.
+     *
+     * @param vnf the VNF
+     * @param relationshipRelatedToValue the related-to value for the relationship
+     * @param dataKey the relationship data key to match on
+     * @param dataValue the value the relationship data with the given key must match
+     * @return the deleted relationship or <code>null</code> if none found matching the given criteria
+     */
+    public Relationship deleteRelationshipWithDataValue(final GenericVnf vnf, final String relationshipRelatedToValue,
+            final String dataKey, final String dataValue) {
+        final Iterator<Relationship> relationships =
+                vnf.getRelationshipList() == null ? Collections.<Relationship>emptyList().iterator()
+                        : vnf.getRelationshipList().getRelationship().iterator();
+
+        while (relationships.hasNext()) {
+            final Relationship relationship = relationships.next();
+            if (relationship.getRelatedTo().equals(relationshipRelatedToValue)
+                    && dataValue.equals(getRelationshipData(relationship, dataKey))) {
+                relationships.remove();
+                return relationship;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Select a VNFM to use for the given generic VNF. Should only be used when no VNFM has already been assigned to the
+     * VNF.
      *
      * @param vnf the generic VNF
      * @return the VNFM to use
@@ -150,6 +202,9 @@ public class AaiHelper {
         logger.debug("VNFMs in ESR: " + vnfmsInEsr);
 
         for (final EsrVnfm vnfm : vnfmsInEsr.getEsrVnfm()) {
+            final EsrSystemInfoList systemInfolist =
+                    aaiServiceProvider.invokeGetVnfmEsrSystemInfoList(vnfm.getVnfmId());
+            vnfm.setEsrSystemInfoList(systemInfolist);
             if (vnfmHasMatchingEsrSystemInfoType(vnfm, vnf.getNfType())) {
                 return vnfm;
             }
@@ -160,7 +215,7 @@ public class AaiHelper {
     private boolean vnfmHasMatchingEsrSystemInfoType(final EsrVnfm vnfm, final String type) {
         logger.debug("Checking VNFM ID: " + vnfm + ": " + vnfm.getVnfmId());
 
-        final EsrSystemInfoList systemInfolist = aaiServiceProvider.invokeGetVnfmEsrSystemInfoList(vnfm.getVnfmId());
+        final EsrSystemInfoList systemInfolist = vnfm.getEsrSystemInfoList();
         if (systemInfolist != null) {
             for (final EsrSystemInfo esrSystemInfo : systemInfolist.getEsrSystemInfo()) {
                 if (esrSystemInfo.getType().equals(type)) {
@@ -172,4 +227,79 @@ public class AaiHelper {
         return false;
     }
 
+    /**
+     * Create a vserver.
+     *
+     * @param vnfc the VNFC to base the vserver on
+     * @return the vserver
+     */
+    public Vserver createVserver(final LcnVnfLcmOperationOccurrenceNotificationAffectedVnfcs vnfc) {
+        final Vserver vserver = new Vserver();
+        vserver.setVserverId(vnfc.getComputeResource().getResourceId());
+        vserver.setVserverName(vnfc.getId());
+        vserver.setProvStatus("active");
+        vserver.setVserverSelflink("Not available");
+        return vserver;
+    }
+
+    /**
+     * Add a relationship to the given vserver to the given VNF.
+     *
+     * @param vnf the vserver
+     * @param vnfmId the ID of the VNF
+     */
+    public void addRelationshipFromVserverVnfToGenericVnf(final Vserver vserver, final String vnfId) {
+        if (vserver.getRelationshipList() == null) {
+            vserver.setRelationshipList(new RelationshipList());
+        }
+        final RelationshipList vserverRelationshiplist = vserver.getRelationshipList();
+        vserverRelationshiplist.getRelationship().add(createRelationshipToGenericVnf(vnfId));
+    }
+
+    private Relationship createRelationshipToGenericVnf(final String vnfId) {
+        final Relationship relationship = new Relationship();
+        relationship.setRelatedTo("generic-vnf");
+        relationship.setRelationshipLabel("tosca.relationships.HostedOn");
+        relationship.setRelatedLink("/aai/" + AAIVersion.LATEST
+                + AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnfId).build().toString());
+        relationship.getRelationshipData().add(createRelationshipData("generic-vnf.vnf-id", vnfId));
+        return relationship;
+    }
+
+    public void setOamIpAddressSource(final String vnfId, final OamIpAddressSource oamIpAddressSource) {
+        mapOfVnfIdToOamIpAddressHolder.put(vnfId, oamIpAddressSource);
+    }
+
+    public OamIpAddressSource getOamIpAddressSource(final String vnfId) {
+        return mapOfVnfIdToOamIpAddressHolder.get(vnfId);
+    }
+
+    /**
+     * Add a relationship to the given tenant to the given VNF.
+     *
+     * @param vnf the generic vnf
+     * @param tenant the Tenant
+     */
+
+    public void addRelationshipFromGenericVnfToTenant(final GenericVnf vnf, final Tenant tenant) {
+        if (vnf.getRelationshipList() == null) {
+            vnf.setRelationshipList(new RelationshipList());
+        }
+        final RelationshipList vnfmRelationshiplist = vnf.getRelationshipList();
+        vnfmRelationshiplist.getRelationship().add(createRelationshipToTenant(tenant));
+    }
+
+    private Relationship createRelationshipToTenant(final Tenant tenant) {
+        final Relationship relationship = new Relationship();
+        relationship.setRelatedTo("tenant");
+        relationship.setRelatedLink("/aai/" + AAIVersion.LATEST + AAIUriFactory.createResourceUri(AAIObjectType.TENANT,
+                tenant.getCloudOwner(), tenant.getRegionName(), tenant.getTenantId()).build().toString());
+        relationship.getRelationshipData()
+                .add(createRelationshipData("cloud-region.cloud-owner", tenant.getCloudOwner()));
+        relationship.getRelationshipData()
+                .add(createRelationshipData("cloud-region.cloud-region-id", tenant.getRegionName()));
+        relationship.getRelationshipData().add(createRelationshipData("tenant.tenant-id", tenant.getTenantId()));
+        return relationship;
+    }
+
 }