From 052ca56869f350b77250db3505cb55f344e3980a Mon Sep 17 00:00:00 2001
From: Piotr Borelowski
Date: Thu, 27 Feb 2020 11:36:01 +0100
Subject: The Ve-Vnfm Adapter can now subscribe to multiple VNFMs
Ve-Vnfm (SOL002) Adapter project
Issue-ID: SO-2574
Signed-off-by: Piotr Borelowski
Change-Id: I0418fe1fd62b9fd40d47ab90c6b31c8a5a28b793
---
.../onap/so/adapters/vevnfm/aai/AaiConnection.java | 40 ++++++-------
.../org/onap/so/adapters/vevnfm/aai/EsrId.java | 45 ++++++++++++++
.../vevnfm/configuration/StartupConfiguration.java | 5 +-
.../so/adapters/vevnfm/service/DmaapService.java | 15 +++--
.../so/adapters/vevnfm/service/StartupService.java | 11 ++--
.../vevnfm/service/SubscriptionScheduler.java | 57 +++++++++++++-----
.../vevnfm/service/StartupServiceTest.java | 9 ++-
.../vevnfm/service/SubscriptionSchedulerTest.java | 69 ++++++++++++++++++++++
8 files changed, 199 insertions(+), 52 deletions(-)
create mode 100644 adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/aai/EsrId.java
create mode 100644 adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/SubscriptionSchedulerTest.java
(limited to 'adapters')
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/aai/AaiConnection.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/aai/AaiConnection.java
index a2bd603ae6..9b2a8c3d62 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/aai/AaiConnection.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/aai/AaiConnection.java
@@ -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 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 receiveVnfm() throws VeVnfmException {
+ List 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 receiveVnfmInternal() {
final AAIResourcesClient resourcesClient = new AAIResourcesClient();
final AAIResourceUri resourceUri = AAIUriFactory.createResourceUri(AAIObjectType.VNFM_LIST);
final Optional response = resourcesClient.get(EsrVnfmList.class, resourceUri);
@@ -73,33 +75,29 @@ public class AaiConnection {
logger.info("The VNFM replied with: {}", esrVnfmList);
final List esrVnfm = esrVnfmList.getEsrVnfm();
- if (esrVnfm.isEmpty()) {
- return null;
+ final List 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 receiveVnfmServiceUrl(final AAIResourcesClient resourcesClient, final String vnfmId) {
final Optional 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 = 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
index 0000000000..13ff2b6397
--- /dev/null
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/aai/EsrId.java
@@ -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;
+ }
+}
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/configuration/StartupConfiguration.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/configuration/StartupConfiguration.java
index ae330f7ed6..c033fc3f96 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/configuration/StartupConfiguration.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/configuration/StartupConfiguration.java
@@ -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 infos = startupService.receiveVnfm();
+ subscriptionScheduler.setInfos(infos);
}
}
}
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/DmaapService.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/DmaapService.java
index 59397cead3..36a4c3300d 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/DmaapService.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/DmaapService.java
@@ -25,12 +25,15 @@ public class DmaapService {
private HttpRestServiceProvider restProvider;
public void send(final VnfLcmOperationOccurrenceNotification notification) {
- final ResponseEntity 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 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() {
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/StartupService.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/StartupService.java
index 3d215148f2..92906ef35c 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/StartupService.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/StartupService.java
@@ -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 receiveVnfm() throws VeVnfmException {
return aaiConnection.receiveVnfm();
}
@Recover
- public EsrSystemInfo recoverReceiveVnfm(final Throwable e) {
+ public List 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);
}
}
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriptionScheduler.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriptionScheduler.java
index 16427437fc..d9f3acc3df 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriptionScheduler.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriptionScheduler.java
@@ -20,7 +20,10 @@
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 esrIds;
- private EsrSystemInfo info;
+ public void setInfos(final List 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 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);
}
}
}
diff --git a/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/StartupServiceTest.java b/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/StartupServiceTest.java
index d1d34a706f..9b18cf96dc 100644
--- a/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/StartupServiceTest.java
+++ b/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/StartupServiceTest.java
@@ -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 infos = Collections.singletonList(info);
- when(aaiConnection.receiveVnfm()).thenReturn(info);
+ when(aaiConnection.receiveVnfm()).thenReturn(infos);
// when
- final EsrSystemInfo systemInfo = startupService.receiveVnfm();
+ final List 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
index 0000000000..d3da7c86ec
--- /dev/null
+++ b/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/SubscriptionSchedulerTest.java
@@ -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 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());
+ }
+}
--
cgit 1.2.3-korg