Added handling for OAM IP address

Change-Id: Iaae7f17517dc44767b73495e62549765edc4e343
Issue-ID: SO-1637
Signed-off-by: MichaelMorris <michael.morris@est.tech>
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/aai/AaiHelper.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/aai/AaiHelper.java
index 9139d5e..ee04819 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/aai/AaiHelper.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/aai/AaiHelper.java
@@ -21,6 +21,8 @@
 package org.onap.so.adapters.vnfmadapter.extclients.aai;
 
 import java.util.Collections;
+import java.util.HashMap;
+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;
@@ -49,6 +51,7 @@
 
     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) {
@@ -223,4 +226,12 @@
         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);
+    }
+
 }
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/aai/OamIpAddressSource.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/aai/OamIpAddressSource.java
new file mode 100644
index 0000000..54b4055
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/aai/OamIpAddressSource.java
@@ -0,0 +1,59 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter.extclients.aai;
+
+import org.onap.so.adapters.vnfmadapter.extclients.aai.OamIpAddressSource.OamIpAddressType;
+
+/**
+ * Represents the source of the value to use as the AAI OAM IP address of a VNF
+ */
+public class OamIpAddressSource {
+
+    private final OamIpAddressType type;
+    private final String value;
+
+    public OamIpAddressSource(final OamIpAddressType type, final String value) {
+        this.type = type;
+        this.value = value;
+    }
+
+    public OamIpAddressType getType() {
+        return type;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public enum OamIpAddressType {
+        /**
+         * The value passed in {@link OamIpAddress#OamIpAddress(OamIpAddressType, String)} is to be used directly as the
+         * OAM IP address
+         */
+        LITERAL,
+        /**
+         * The OAM IP address is to be retrieved from the vnfConfigurableProperties returned from the VNFM using the
+         * value passed in {@link OamIpAddress#OamIpAddress(OamIpAddressType, String)} as the name of a property
+         */
+        CONFIGURABLE_PROPERTY
+    }
+
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/lifecycle/LifecycleManager.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/lifecycle/LifecycleManager.java
index 7f0f9e3..7085218 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/lifecycle/LifecycleManager.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/lifecycle/LifecycleManager.java
@@ -21,10 +21,13 @@
 package org.onap.so.adapters.vnfmadapter.lifecycle;
 
 import com.google.common.base.Optional;
+import java.util.Map;
 import org.onap.aai.domain.yang.EsrVnfm;
 import org.onap.aai.domain.yang.GenericVnf;
 import org.onap.so.adapters.vnfmadapter.extclients.aai.AaiHelper;
 import org.onap.so.adapters.vnfmadapter.extclients.aai.AaiServiceProvider;
+import org.onap.so.adapters.vnfmadapter.extclients.aai.OamIpAddressSource;
+import org.onap.so.adapters.vnfmadapter.extclients.aai.OamIpAddressSource.OamIpAddressType;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.VnfmHelper;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.VnfmServiceProvider;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InlineResponse201;
@@ -83,6 +86,10 @@
         }
 
         final String vnfIdInVnfm = sendCreateRequestToVnfm(genericVnf);
+
+        final OamIpAddressSource oamIpAddressSource = extractOamIpAddressSource(request);
+        aaiHelper.setOamIpAddressSource(vnfIdInVnfm, oamIpAddressSource);
+
         createNotificationSubscription(vnfm.getVnfmId(), vnfIdInVnfm);
         final String operationId = sendInstantiateRequestToVnfm(vnfm, genericVnf, request, vnfIdInAai, vnfIdInVnfm);
 
@@ -92,6 +99,19 @@
         return response;
     }
 
+    private OamIpAddressSource extractOamIpAddressSource(final CreateVnfRequest request) {
+        final Map<String, String> additionalParams = request.getAdditionalParams();
+        try {
+            final String sourceType = additionalParams.remove("oamIpAddressSourceType");
+            final String sourceValue = additionalParams.remove("oamIpAddressSourceValue");
+            final OamIpAddressType oamIpAddressType = OamIpAddressType.valueOf(sourceType.toUpperCase());
+            return new OamIpAddressSource(oamIpAddressType, sourceValue);
+        } catch (final NullPointerException | IllegalArgumentException exception) {
+            logger.debug("Additional Params not set for OAM IP address source", exception);
+            return null;
+        }
+    }
+
     private void checkIfVnfAlreadyExistsInVnfm(final GenericVnf genericVnf) {
         if (genericVnf.getSelflink() != null && !genericVnf.getSelflink().isEmpty()) {
             Optional<InlineResponse201> response = Optional.absent();
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/notificationhandling/NotificationHandler.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/notificationhandling/NotificationHandler.java
index a81451b..506eb8d 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/notificationhandling/NotificationHandler.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/notificationhandling/NotificationHandler.java
@@ -30,6 +30,8 @@
 import org.onap.aai.domain.yang.Vserver;
 import org.onap.so.adapters.vnfmadapter.extclients.aai.AaiHelper;
 import org.onap.so.adapters.vnfmadapter.extclients.aai.AaiServiceProvider;
+import org.onap.so.adapters.vnfmadapter.extclients.aai.OamIpAddressSource;
+import org.onap.so.adapters.vnfmadapter.extclients.aai.OamIpAddressSource.OamIpAddressType;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.VnfmServiceProvider;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.LcnVnfLcmOperationOccurrenceNotificationAffectedVnfcs;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.VnfLcmOperationOccurrenceNotification;
@@ -93,9 +95,7 @@
     private void handleVnfInstantiateCompleted() {
         final GenericVnf genericVnf =
                 aaiServiceProvider.invokeQueryGenericVnf(vnfInstance.getLinks().getSelf().getHref()).get(0);
-        final String ipAddress = getOamIpAddress(vnfInstance);
-        logger.debug("Updating " + genericVnf.getVnfId() + " with VNF OAM IP ADDRESS: " + ipAddress);
-        genericVnf.setIpv4OamAddress(ipAddress);
+        setOamIpAddress(genericVnf, vnfInstance);
         genericVnf.setOrchestrationStatus("Created");
 
         aaiServiceProvider.invokePutGenericVnf(genericVnf);
@@ -106,18 +106,24 @@
         logger.debug("Finished handling notification for vnfm: " + vnfInstance.getId());
     }
 
-    private String getOamIpAddress(final InlineResponse201 vnfInstance) {
+    private void setOamIpAddress(final GenericVnf genericVnf, final InlineResponse201 vnfInstance) {
+        final OamIpAddressSource oamIpAddressSource = aaiHelper.getOamIpAddressSource(vnfInstance.getId());
+        if (oamIpAddressSource == null) {
+            logger.warn("No source indicated for OAM IP address, no value will be set in AAI");
+            return;
+        }
+        if (oamIpAddressSource.getType().equals(OamIpAddressType.LITERAL)) {
+            genericVnf.setIpv4OamAddress(oamIpAddressSource.getValue());
+        }
         try {
             logger.debug("ConfigurableProperties: " + vnfInstance.getVnfConfigurableProperties());
             if (vnfInstance.getVnfConfigurableProperties() == null) {
                 logger.warn("No ConfigurableProperties, cannot set OAM IP Address");
-                return null;
             }
             final JSONObject properties = new JSONObject((Map) vnfInstance.getVnfConfigurableProperties());
-            return properties.get("vnfIpAddress").toString();
+            genericVnf.setIpv4OamAddress(properties.get(oamIpAddressSource.getValue()).toString());
         } catch (final JSONException jsonException) {
             logger.error("Error getting vnfIpAddress", jsonException);
-            return null;
         }
     }
 
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003LcnControllerTest.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003LcnControllerTest.java
index 0f20390..aa089e1 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003LcnControllerTest.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003LcnControllerTest.java
@@ -38,6 +38,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import javax.inject.Inject;
 import org.hamcrest.BaseMatcher;
 import org.hamcrest.Description;
 import org.junit.Before;
@@ -49,6 +50,9 @@
 import org.onap.aai.domain.yang.Relationship;
 import org.onap.aai.domain.yang.Vserver;
 import org.onap.so.adapters.vnfmadapter.VnfmAdapterApplication;
+import org.onap.so.adapters.vnfmadapter.extclients.aai.AaiHelper;
+import org.onap.so.adapters.vnfmadapter.extclients.aai.OamIpAddressSource;
+import org.onap.so.adapters.vnfmadapter.extclients.aai.OamIpAddressSource.OamIpAddressType;
 import org.onap.so.adapters.vnfmadapter.extclients.vim.model.AccessInfo;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.LcnVnfLcmOperationOccurrenceNotificationAffectedVnfcs;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.LcnVnfLcmOperationOccurrenceNotificationAffectedVnfcs.ChangeTypeEnum;
@@ -102,6 +106,9 @@
     private Sol003LcnContoller controller;
     private final Gson gson = new Gson();
 
+    @Inject
+    private AaiHelper aaiHelper;
+
     @Before
     public void setUp() throws Exception {
         mockRestServer = MockRestServiceServer.bindTo(testRestTemplate).build();
@@ -269,6 +276,7 @@
 
     private InlineResponse201 createVnfInstance() {
         final InlineResponse201 vnfInstance = new InlineResponse201();
+        vnfInstance.setId("myTestVnfIdOnVnfm");
         final InlineResponse201LinksSelf selfLink = new InlineResponse201LinksSelf();
         selfLink.setHref("http://vnfm:8080/vnfs/myTestVnfIdOnVnfm");
         final InlineResponse201Links VnfInstancelinks = new InlineResponse201Links();
@@ -288,6 +296,10 @@
         vimConnection.setAccessInfo(accessInfo);
         vimConnectionInfo.add(vimConnection);
         vnfInstance.setVimConnectionInfo(vimConnectionInfo);
+
+        final OamIpAddressSource oamIpAddressSource =
+                new OamIpAddressSource(OamIpAddressType.CONFIGURABLE_PROPERTY, "vnfIpAddress");
+        aaiHelper.setOamIpAddressSource("myTestVnfIdOnVnfm", oamIpAddressSource);
         return vnfInstance;
     }