The Ve-Vnfm Adapter can now subscribe to multiple VNFMs 75/102475/2
authorPiotr Borelowski <p.borelowski@partner.samsung.com>
Thu, 27 Feb 2020 10:36:01 +0000 (11:36 +0100)
committerPiotr Borelowski <p.borelowski@partner.samsung.com>
Thu, 27 Feb 2020 14:14:54 +0000 (15:14 +0100)
Ve-Vnfm (SOL002) Adapter project

Issue-ID: SO-2574
Signed-off-by: Piotr Borelowski <p.borelowski@partner.samsung.com>
Change-Id: I0418fe1fd62b9fd40d47ab90c6b31c8a5a28b793

adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/aai/AaiConnection.java
adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/aai/EsrId.java [new file with mode: 0644]
adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/configuration/StartupConfiguration.java
adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/DmaapService.java
adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/StartupService.java
adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriptionScheduler.java
adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/StartupServiceTest.java
adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/SubscriptionSchedulerTest.java [new file with mode: 0644]

index a2bd603..9b2a8c3 100644 (file)
@@ -20,6 +20,8 @@
 
 package org.onap.so.adapters.vevnfm.aai;
 
+import java.util.Collections;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Optional;
 import org.apache.logging.log4j.util.Strings;
@@ -43,27 +45,27 @@ public class AaiConnection {
 
     private static final int FIRST_INDEX = 0;
 
-    private static void isValid(final EsrSystemInfo info) throws VeVnfmException {
-        if (info == null || Strings.isBlank(info.getServiceUrl())) {
+    private static void isValid(final List<EsrSystemInfo> infos) throws VeVnfmException {
+        if (infos == null || infos.isEmpty() || Strings.isBlank(infos.get(FIRST_INDEX).getServiceUrl())) {
             throw new VeVnfmException("No 'url' field in VNFM info");
         }
     }
 
-    public EsrSystemInfo receiveVnfm() throws VeVnfmException {
-        EsrSystemInfo info;
+    public List<EsrSystemInfo> receiveVnfm() throws VeVnfmException {
+        List<EsrSystemInfo> infos;
 
         try {
-            info = receiveVnfmInternal();
+            infos = receiveVnfmInternal();
         } catch (Exception e) {
             throw new VeVnfmException(e);
         }
 
-        isValid(info);
+        isValid(infos);
 
-        return info;
+        return infos;
     }
 
-    private EsrSystemInfo receiveVnfmInternal() {
+    private List<EsrSystemInfo> receiveVnfmInternal() {
         final AAIResourcesClient resourcesClient = new AAIResourcesClient();
         final AAIResourceUri resourceUri = AAIUriFactory.createResourceUri(AAIObjectType.VNFM_LIST);
         final Optional<EsrVnfmList> response = resourcesClient.get(EsrVnfmList.class, resourceUri);
@@ -73,33 +75,29 @@ public class AaiConnection {
             logger.info("The VNFM replied with: {}", esrVnfmList);
             final List<EsrVnfm> esrVnfm = esrVnfmList.getEsrVnfm();
 
-            if (esrVnfm.isEmpty()) {
-                return null;
+            final List<EsrSystemInfo> infos = new LinkedList<>();
+
+            for (final EsrVnfm vnfm : esrVnfm) {
+                final String vnfmId = vnfm.getVnfmId();
+                infos.addAll(receiveVnfmServiceUrl(resourcesClient, vnfmId));
             }
 
-            final String vnfmId = esrVnfm.get(FIRST_INDEX).getVnfmId();
-            return receiveVnfmServiceUrl(resourcesClient, vnfmId);
+            return infos;
         }
 
         return null;
     }
 
-    private EsrSystemInfo receiveVnfmServiceUrl(final AAIResourcesClient resourcesClient, final String vnfmId) {
+    private List<EsrSystemInfo> receiveVnfmServiceUrl(final AAIResourcesClient resourcesClient, final String vnfmId) {
         final Optional<EsrVnfm> response = resourcesClient.get(EsrVnfm.class,
                 AAIUriFactory.createResourceUri(AAIObjectType.VNFM, vnfmId).depth(Depth.ONE));
 
         if (response.isPresent()) {
             final EsrVnfm esrVnfm = response.get();
             logger.info("The VNFM replied with: {}", esrVnfm);
-            final List<EsrSystemInfo> esrSystemInfo = esrVnfm.getEsrSystemInfoList().getEsrSystemInfo();
-
-            if (esrSystemInfo.isEmpty()) {
-                return null;
-            }
-
-            return esrSystemInfo.get(FIRST_INDEX);
+            return esrVnfm.getEsrSystemInfoList().getEsrSystemInfo();
         }
 
-        return null;
+        return Collections.emptyList();
     }
 }
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/aai/EsrId.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/aai/EsrId.java
new file mode 100644 (file)
index 0000000..13ff2b6
--- /dev/null
@@ -0,0 +1,45 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SO
+ * ================================================================================
+ * Copyright (C) 2020 Samsung. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vevnfm.aai;
+
+import org.onap.aai.domain.yang.EsrSystemInfo;
+
+public class EsrId {
+
+    private EsrSystemInfo info;
+    private String id;
+
+    public EsrSystemInfo getInfo() {
+        return info;
+    }
+
+    public void setInfo(final EsrSystemInfo info) {
+        this.info = info;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(final String id) {
+        this.id = id;
+    }
+}
index ae330f7..c033fc3 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.so.adapters.vevnfm.configuration;
 
+import java.util.List;
 import org.onap.aai.domain.yang.EsrSystemInfo;
 import org.onap.so.adapters.vevnfm.service.StartupService;
 import org.onap.so.adapters.vevnfm.service.SubscriptionScheduler;
@@ -47,8 +48,8 @@ public class StartupConfiguration {
     @EventListener(ApplicationReadyEvent.class)
     public void onApplicationReadyEvent() throws Exception {
         if (!environment.acceptsProfiles(Profiles.of(TEST_PROFILE))) {
-            final EsrSystemInfo info = startupService.receiveVnfm();
-            subscriptionScheduler.setInfo(info);
+            final List<EsrSystemInfo> infos = startupService.receiveVnfm();
+            subscriptionScheduler.setInfos(infos);
         }
     }
 }
index 59397ce..36a4c33 100644 (file)
@@ -25,12 +25,15 @@ public class DmaapService {
     private HttpRestServiceProvider restProvider;
 
     public void send(final VnfLcmOperationOccurrenceNotification notification) {
-        final ResponseEntity<String> response = restProvider.postHttpRequest(notification, getUrl(), String.class);
-
-        final HttpStatus statusCode = response.getStatusCode();
-        final String body = response.getBody();
-
-        logger.info("The DMaaP replied with the code {} and the body {}", statusCode, body);
+        try {
+            final ResponseEntity<String> response = restProvider.postHttpRequest(notification, getUrl(), String.class);
+            final HttpStatus statusCode = response.getStatusCode();
+            final String body = response.getBody();
+
+            logger.info("The DMaaP replied with the code {} and the body {}", statusCode, body);
+        } catch (Exception e) {
+            logger.warn("An issue connecting to DMaaP", e);
+        }
     }
 
     private String getUrl() {
index 3d21514..92906ef 100644 (file)
@@ -20,6 +20,8 @@
 
 package org.onap.so.adapters.vevnfm.service;
 
+import java.util.Collections;
+import java.util.List;
 import org.onap.aai.domain.yang.EsrSystemInfo;
 import org.onap.so.adapters.vevnfm.aai.AaiConnection;
 import org.onap.so.adapters.vevnfm.exception.VeVnfmException;
@@ -45,18 +47,17 @@ public class StartupService {
     @Autowired
     private AaiConnection aaiConnection;
 
-    @Retryable(value = {VeVnfmException.class}, maxAttempts = 5, backoff = @Backoff(delay = 5000, multiplier = 10))
-    public EsrSystemInfo receiveVnfm() throws VeVnfmException {
+    @Retryable(value = {Exception.class}, maxAttempts = 5, backoff = @Backoff(delay = 5000, multiplier = 2))
+    public List<EsrSystemInfo> receiveVnfm() throws VeVnfmException {
         return aaiConnection.receiveVnfm();
     }
 
     @Recover
-    public EsrSystemInfo recoverReceiveVnfm(final Throwable e) {
+    public List<EsrSystemInfo> recoverReceiveVnfm(final Throwable t) {
         logger.warn("Connection to AAI failed");
         final EsrSystemInfo info = new EsrSystemInfo();
         info.setServiceUrl(vnfmDefaultEndpoint);
         logger.warn("This EsrSystemInfo is used by default: {}", info);
-
-        return info;
+        return Collections.singletonList(info);
     }
 }
index 1642743..d9f3acc 100644 (file)
 
 package org.onap.so.adapters.vevnfm.service;
 
+import java.util.LinkedList;
+import java.util.List;
 import org.onap.aai.domain.yang.EsrSystemInfo;
+import org.onap.so.adapters.vevnfm.aai.EsrId;
 import org.onap.so.adapters.vevnfm.exception.VeVnfmException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -38,33 +41,57 @@ public class SubscriptionScheduler {
     @Autowired
     private SubscriberService subscriberService;
 
-    private String subscribedId;
+    private List<EsrId> esrIds;
 
-    private EsrSystemInfo info;
+    public void setInfos(final List<EsrSystemInfo> infos) {
+        esrIds = new LinkedList<>();
 
-    public void setInfo(final EsrSystemInfo info) {
-        this.info = info;
+        for (final EsrSystemInfo info : infos) {
+            final EsrId esrId = new EsrId();
+            esrId.setInfo(info);
+            esrIds.add(esrId);
+        }
+    }
+
+    List<EsrId> getEsrIds() {
+        return esrIds;
     }
 
     @Scheduled(fixedRate = 5000, initialDelay = 2000)
     void subscribeTask() throws VeVnfmException {
-        if (info != null) {
-            if (subscribedId == null) {
-                logger.info("Starting subscribe task");
-                subscribedId = subscriberService.subscribe(info);
+        if (isEsrIdsValid()) {
+            for (final EsrId esrId : esrIds) {
+                singleSubscribe(esrId);
             }
         }
     }
 
     @Scheduled(fixedRate = 20000)
     void checkSubscribeTask() throws VeVnfmException {
-        if (info != null) {
-            if (subscribedId != null) {
-                logger.info("Checking subscription: {}", subscribedId);
-                if (!subscriberService.checkSubscription(info, subscribedId)) {
-                    logger.info("Subscription {} not available", subscribedId);
-                    subscribedId = null;
-                }
+        if (isEsrIdsValid()) {
+            for (final EsrId esrId : esrIds) {
+                singleCheckSubscription(esrId);
+            }
+        }
+    }
+
+    private boolean isEsrIdsValid() {
+        return esrIds != null && !esrIds.isEmpty();
+    }
+
+    private void singleSubscribe(final EsrId esrId) throws VeVnfmException {
+        if (esrId.getId() == null) {
+            logger.info("Single subscribe task");
+            esrId.setId(subscriberService.subscribe(esrId.getInfo()));
+        }
+    }
+
+    private void singleCheckSubscription(final EsrId esrId) throws VeVnfmException {
+        if (esrId.getId() != null) {
+            logger.info("Checking subscription: {}", esrId.getId());
+            if (!subscriberService.checkSubscription(esrId.getInfo(), esrId.getId())) {
+                logger.info("Subscription {} not available", esrId.getId());
+                esrId.setId(null);
             }
         }
     }
index d1d34a7..9b18cf9 100644 (file)
@@ -23,6 +23,8 @@ package org.onap.so.adapters.vevnfm.service;
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
+import java.util.Collections;
+import java.util.List;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -52,14 +54,15 @@ public class StartupServiceTest {
         // given
         final EsrSystemInfo info = new EsrSystemInfo();
         info.setServiceUrl(URL);
+        final List<EsrSystemInfo> infos = Collections.singletonList(info);
 
-        when(aaiConnection.receiveVnfm()).thenReturn(info);
+        when(aaiConnection.receiveVnfm()).thenReturn(infos);
 
         // when
-        final EsrSystemInfo systemInfo = startupService.receiveVnfm();
+        final List<EsrSystemInfo> systemInfo = startupService.receiveVnfm();
 
         // then
         verify(aaiConnection).receiveVnfm();
-        assertEquals(info, systemInfo);
+        assertEquals(infos, systemInfo);
     }
 }
diff --git a/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/SubscriptionSchedulerTest.java b/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/SubscriptionSchedulerTest.java
new file mode 100644 (file)
index 0000000..d3da7c8
--- /dev/null
@@ -0,0 +1,69 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SO
+ * ================================================================================
+ * Copyright (C) 2020 Samsung. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vevnfm.service;
+
+import static org.junit.Assert.assertNull;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import java.util.Collections;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.aai.domain.yang.EsrSystemInfo;
+
+@RunWith(MockitoJUnitRunner.class)
+public class SubscriptionSchedulerTest {
+
+    private static final String URL = "url";
+    private static final String ID = "id044";
+
+    @Mock
+    private SubscriberService subscriberService;
+
+    @InjectMocks
+    private SubscriptionScheduler subscriptionScheduler;
+
+    @Test
+    public void testFullScenario() throws Exception {
+        // given
+        final EsrSystemInfo info = new EsrSystemInfo();
+        info.setServiceUrl(URL);
+        final List<EsrSystemInfo> infos = Collections.singletonList(info);
+
+        when(subscriberService.subscribe(eq(info))).thenReturn(ID);
+        when(subscriberService.checkSubscription(eq(info), eq(ID))).thenReturn(false);
+
+        // when
+        subscriptionScheduler.setInfos(infos);
+        subscriptionScheduler.subscribeTask();
+        subscriptionScheduler.checkSubscribeTask();
+
+        // then
+        verify(subscriberService).subscribe(info);
+        verify(subscriberService).checkSubscription(info, ID);
+
+        assertNull(subscriptionScheduler.getEsrIds().get(0).getId());
+    }
+}