From: Piotr Borelowski 
Date: Fri, 14 Feb 2020 08:15:38 +0000 (+0100)
Subject: Multiplied connection to AAI and subscription to VNFM (if they fail)
X-Git-Tag: 1.6.1~190
X-Git-Url: https://gerrit.onap.org/r/gitweb?a=commitdiff_plain;h=1e37b701d1a2ab4ed41138fdc097f480dfaf305d;p=so.git
Multiplied connection to AAI and subscription to VNFM (if they fail)
(+small changes required by OOM)
Ve-Vnfm (SOL002) Adapter project
Issue-ID: SO-2574
Signed-off-by: Piotr Borelowski 
Change-Id: I42bb30b4bbf256340123d64d203f461ed336ebc3
---
diff --git a/adapters/mso-ve-vnfm-adapter/pom.xml b/adapters/mso-ve-vnfm-adapter/pom.xml
index 4472956eb7..d58f183ab0 100644
--- a/adapters/mso-ve-vnfm-adapter/pom.xml
+++ b/adapters/mso-ve-vnfm-adapter/pom.xml
@@ -29,6 +29,10 @@
       org.springframework.boot
       spring-boot-starter-web
     
+    
+      org.springframework.retry
+      spring-retry
+    
     
       org.onap.so.adapters
       mso-vnfm-adapter-ext-clients
@@ -51,6 +55,10 @@
       org.glassfish.jersey.inject
       jersey-hk2
     
+    
+      org.projectlombok
+      lombok
+    
     
       org.springframework.boot
       spring-boot-starter-test
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 188b6718f2..a2bd603ae6 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
@@ -22,11 +22,14 @@ package org.onap.so.adapters.vevnfm.aai;
 
 import java.util.List;
 import java.util.Optional;
+import org.apache.logging.log4j.util.Strings;
 import org.onap.aai.domain.yang.EsrSystemInfo;
 import org.onap.aai.domain.yang.EsrVnfm;
 import org.onap.aai.domain.yang.EsrVnfmList;
+import org.onap.so.adapters.vevnfm.exception.VeVnfmException;
 import org.onap.so.client.aai.AAIObjectType;
 import org.onap.so.client.aai.AAIResourcesClient;
+import org.onap.so.client.aai.entities.uri.AAIResourceUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
 import org.onap.so.client.graphinventory.entities.uri.Depth;
 import org.slf4j.Logger;
@@ -40,10 +43,30 @@ public class AaiConnection {
 
     private static final int FIRST_INDEX = 0;
 
-    public EsrSystemInfo receiveVnfm() {
+    private static void isValid(final EsrSystemInfo info) throws VeVnfmException {
+        if (info == null || Strings.isBlank(info.getServiceUrl())) {
+            throw new VeVnfmException("No 'url' field in VNFM info");
+        }
+    }
+
+    public EsrSystemInfo receiveVnfm() throws VeVnfmException {
+        EsrSystemInfo info;
+
+        try {
+            info = receiveVnfmInternal();
+        } catch (Exception e) {
+            throw new VeVnfmException(e);
+        }
+
+        isValid(info);
+
+        return info;
+    }
+
+    private EsrSystemInfo receiveVnfmInternal() {
         final AAIResourcesClient resourcesClient = new AAIResourcesClient();
-        final Optional response =
-                resourcesClient.get(EsrVnfmList.class, AAIUriFactory.createResourceUri(AAIObjectType.VNFM_LIST));
+        final AAIResourceUri resourceUri = AAIUriFactory.createResourceUri(AAIObjectType.VNFM_LIST);
+        final Optional response = resourcesClient.get(EsrVnfmList.class, resourceUri);
 
         if (response.isPresent()) {
             final EsrVnfmList esrVnfmList = response.get();
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 f7b7283c59..ae330f7ed6 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,7 +20,9 @@
 
 package org.onap.so.adapters.vevnfm.configuration;
 
+import org.onap.aai.domain.yang.EsrSystemInfo;
 import org.onap.so.adapters.vevnfm.service.StartupService;
+import org.onap.so.adapters.vevnfm.service.SubscriptionScheduler;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.context.event.ApplicationReadyEvent;
 import org.springframework.context.annotation.Configuration;
@@ -39,10 +41,14 @@ public class StartupConfiguration {
     @Autowired
     private StartupService startupService;
 
+    @Autowired
+    private SubscriptionScheduler subscriptionScheduler;
+
     @EventListener(ApplicationReadyEvent.class)
     public void onApplicationReadyEvent() throws Exception {
         if (!environment.acceptsProfiles(Profiles.of(TEST_PROFILE))) {
-            startupService.run();
+            final EsrSystemInfo info = startupService.receiveVnfm();
+            subscriptionScheduler.setInfo(info);
         }
     }
 }
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/controller/NotificationController.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/controller/NotificationController.java
index 1882b4e183..cb324c32a9 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/controller/NotificationController.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/controller/NotificationController.java
@@ -38,7 +38,7 @@ public class NotificationController {
     @Autowired
     private DmaapService dmaapService;
 
-    @PostMapping("${notification.url}")
+    @PostMapping("${vnfm.notification}")
     public ResponseEntity receiveNotification(@RequestBody final VnfLcmOperationOccurrenceNotification notification) {
         logger.info("Notification received {}", notification);
         dmaapService.send(notification);
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/exception/VeVnfmException.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/exception/VeVnfmException.java
index abd9ff9d33..a0c1c1e9db 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/exception/VeVnfmException.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/exception/VeVnfmException.java
@@ -25,4 +25,8 @@ public class VeVnfmException extends Exception {
     public VeVnfmException(final String message) {
         super(message);
     }
+
+    public VeVnfmException(final Throwable cause) {
+        super(cause);
+    }
 }
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/provider/AuthorizationHeadersProvider.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/provider/AuthorizationHeadersProvider.java
index 251e0c426b..838a67d115 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/provider/AuthorizationHeadersProvider.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/provider/AuthorizationHeadersProvider.java
@@ -20,11 +20,16 @@
 
 package org.onap.so.adapters.vevnfm.provider;
 
+import org.apache.logging.log4j.util.Strings;
 import org.onap.so.configuration.rest.BasicHttpHeadersProvider;
 
 public class AuthorizationHeadersProvider extends BasicHttpHeadersProvider {
 
     public void addAuthorization(final String authorization) {
+        if (Strings.isBlank(authorization)) {
+            return;
+        }
+
         getHttpHeaders().set(AUTHORIZATION_HEADER, authorization);
     }
 
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 dfbafa223c..3d215148f2 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,35 +20,43 @@
 
 package org.onap.so.adapters.vevnfm.service;
 
-import org.apache.logging.log4j.util.Strings;
 import org.onap.aai.domain.yang.EsrSystemInfo;
 import org.onap.so.adapters.vevnfm.aai.AaiConnection;
 import org.onap.so.adapters.vevnfm.exception.VeVnfmException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.retry.annotation.Backoff;
+import org.springframework.retry.annotation.EnableRetry;
+import org.springframework.retry.annotation.Recover;
+import org.springframework.retry.annotation.Retryable;
 import org.springframework.stereotype.Service;
 
 @Service
+@EnableRetry
 public class StartupService {
 
-    @Autowired
-    private AaiConnection aaiConnection;
+    private static final Logger logger = LoggerFactory.getLogger(StartupService.class);
+
+    @Value("${vnfm.default-endpoint}")
+    private String vnfmDefaultEndpoint;
 
     @Autowired
-    private SubscriberService subscriberService;
+    private AaiConnection aaiConnection;
 
-    private static void isValid(final EsrSystemInfo info) throws VeVnfmException {
-        if (Strings.isBlank(info.getServiceUrl())) {
-            throw new VeVnfmException("No 'url' field in VNFM info");
-        }
+    @Retryable(value = {VeVnfmException.class}, maxAttempts = 5, backoff = @Backoff(delay = 5000, multiplier = 10))
+    public EsrSystemInfo receiveVnfm() throws VeVnfmException {
+        return aaiConnection.receiveVnfm();
     }
 
-    public void run() throws Exception {
-        final EsrSystemInfo info = aaiConnection.receiveVnfm();
-        isValid(info);
-        final boolean done = subscriberService.subscribe(info);
+    @Recover
+    public EsrSystemInfo recoverReceiveVnfm(final Throwable e) {
+        logger.warn("Connection to AAI failed");
+        final EsrSystemInfo info = new EsrSystemInfo();
+        info.setServiceUrl(vnfmDefaultEndpoint);
+        logger.warn("This EsrSystemInfo is used by default: {}", info);
 
-        if (!done) {
-            throw new VeVnfmException("Could not subscribe to VNFM");
-        }
+        return info;
     }
 }
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/subscription/SubscribeSender.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscribeSender.java
similarity index 60%
rename from adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/subscription/SubscribeSender.java
rename to adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscribeSender.java
index 8fdfb41d26..d01c3c8f66 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/subscription/SubscribeSender.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscribeSender.java
@@ -18,9 +18,11 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.adapters.vevnfm.subscription;
+package org.onap.so.adapters.vevnfm.service;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import org.onap.aai.domain.yang.EsrSystemInfo;
+import org.onap.so.adapters.vevnfm.exception.VeVnfmException;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.LccnSubscriptionRequest;
 import org.onap.so.rest.service.HttpRestServiceProvider;
 import org.slf4j.Logger;
@@ -29,11 +31,14 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
-import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+import lombok.ToString;
 
-@Component
+@Service
 public class SubscribeSender {
 
+    public static final String SLASH = "/";
+
     private static final Logger logger = LoggerFactory.getLogger(SubscribeSender.class);
 
     @Value("${vnfm.subscription}")
@@ -42,18 +47,37 @@ public class SubscribeSender {
     @Autowired
     private HttpRestServiceProvider restProvider;
 
-    public boolean send(final EsrSystemInfo info, final LccnSubscriptionRequest request) {
-        final ResponseEntity response = restProvider.postHttpRequest(request, getUrl(info), String.class);
+    public String send(final EsrSystemInfo info, final LccnSubscriptionRequest request) throws VeVnfmException {
+        final ResponseEntity response =
+                restProvider.postHttpRequest(request, getUrl(info), SubscribeToManoResponse.class);
 
         final HttpStatus statusCode = response.getStatusCode();
-        final String body = response.getBody();
+        final SubscribeToManoResponse body = response.getBody();
 
         logger.info("The VNFM replied with the code {} and the body {}", statusCode, body);
 
-        return HttpStatus.CREATED == statusCode;
+        if (HttpStatus.CREATED != statusCode) {
+            throw new VeVnfmException("The status code was different than " + HttpStatus.CREATED);
+        }
+
+        return body.id;
+    }
+
+    public boolean check(final EsrSystemInfo info, final String id) {
+        final ResponseEntity response =
+                restProvider.getHttpResponse(getUrl(info) + SLASH + id, SubscribeToManoResponse.class);
+        return response.getBody() != null && response.getBody().id.equals(id);
     }
 
     private String getUrl(final EsrSystemInfo info) {
         return info.getServiceUrl() + vnfmSubscription;
     }
+
+    @ToString
+    static class SubscribeToManoResponse {
+        @JsonProperty("id")
+        String id;
+        @JsonProperty("callbackUri")
+        String callbackUri;
+    }
 }
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriberService.java b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriberService.java
index eefd9ba93b..9760584d7a 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriberService.java
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriberService.java
@@ -22,9 +22,10 @@ package org.onap.so.adapters.vevnfm.service;
 
 import com.squareup.okhttp.Credentials;
 import java.util.Collections;
+import org.apache.logging.log4j.util.Strings;
 import org.onap.aai.domain.yang.EsrSystemInfo;
+import org.onap.so.adapters.vevnfm.exception.VeVnfmException;
 import org.onap.so.adapters.vevnfm.provider.AuthorizationHeadersProvider;
-import org.onap.so.adapters.vevnfm.subscription.SubscribeSender;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.LccnSubscriptionRequest;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.SubscriptionsAuthentication;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.SubscriptionsAuthenticationParamsBasic;
@@ -35,16 +36,11 @@ import org.springframework.stereotype.Service;
 @Service
 public class SubscriberService {
 
-    private static final char COLON = ':';
+    @Value("${vevnfmadapter.endpoint}")
+    private String endpoint;
 
-    @Value("${system.url}")
-    private String systemUrl;
-
-    @Value("${server.port}")
-    private String serverPort;
-
-    @Value("${notification.url}")
-    private String notificationUrl;
+    @Value("${vnfm.notification}")
+    private String notification;
 
     @Value("${spring.security.usercredentials[0].username}")
     private String username;
@@ -59,19 +55,40 @@ public class SubscriberService {
     private SubscribeSender sender;
 
     private static String getAuthorization(final EsrSystemInfo info) {
-        return Credentials.basic(info.getUserName(), info.getPassword());
+        if (info == null) {
+            return null;
+        }
+
+        final String userName = info.getUserName();
+
+        if (Strings.isBlank(userName)) {
+            return null;
+        }
+
+        final String password = info.getPassword();
+        return Credentials.basic(userName, password);
     }
 
-    public boolean subscribe(final EsrSystemInfo info) {
+    public String subscribe(final EsrSystemInfo info) throws VeVnfmException {
         try {
             headersProvider.addAuthorization(getAuthorization(info));
             final LccnSubscriptionRequest request = createRequest();
             return sender.send(info, request);
+        } catch (Exception e) {
+            throw new VeVnfmException(e);
         } finally {
             headersProvider.removeAuthorization();
         }
     }
 
+    public boolean checkSubscription(final EsrSystemInfo info, final String id) throws VeVnfmException {
+        try {
+            return sender.check(info, id);
+        } catch (Exception e) {
+            throw new VeVnfmException(e);
+        }
+    }
+
     private LccnSubscriptionRequest createRequest() {
         final LccnSubscriptionRequest request = new LccnSubscriptionRequest();
         request.callbackUri(getCallbackUri());
@@ -87,6 +104,6 @@ public class SubscriberService {
     }
 
     private String getCallbackUri() {
-        return systemUrl + COLON + serverPort + notificationUrl;
+        return endpoint + notification;
     }
 }
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
new file mode 100644
index 0000000000..16427437fc
--- /dev/null
+++ b/adapters/mso-ve-vnfm-adapter/src/main/java/org/onap/so/adapters/vevnfm/service/SubscriptionScheduler.java
@@ -0,0 +1,71 @@
+/*-
+ * ============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 org.onap.aai.domain.yang.EsrSystemInfo;
+import org.onap.so.adapters.vevnfm.exception.VeVnfmException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+@Service
+@EnableScheduling
+public class SubscriptionScheduler {
+
+    private static final Logger logger = LoggerFactory.getLogger(SubscriptionScheduler.class);
+
+    @Autowired
+    private SubscriberService subscriberService;
+
+    private String subscribedId;
+
+    private EsrSystemInfo info;
+
+    public void setInfo(final EsrSystemInfo info) {
+        this.info = info;
+    }
+
+    @Scheduled(fixedRate = 5000, initialDelay = 2000)
+    void subscribeTask() throws VeVnfmException {
+        if (info != null) {
+            if (subscribedId == null) {
+                logger.info("Starting subscribe task");
+                subscribedId = subscriberService.subscribe(info);
+            }
+        }
+    }
+
+    @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;
+                }
+            }
+        }
+    }
+}
diff --git a/adapters/mso-ve-vnfm-adapter/src/main/resources/application.yaml b/adapters/mso-ve-vnfm-adapter/src/main/resources/application.yaml
index 35871c51ac..72198b83c1 100644
--- a/adapters/mso-ve-vnfm-adapter/src/main/resources/application.yaml
+++ b/adapters/mso-ve-vnfm-adapter/src/main/resources/application.yaml
@@ -15,13 +15,10 @@
 # limitations under the License.
 
 server:
-  port: 8080
+  port: 9098
 
-system:
-  url: http://localhost
-
-notification:
-  url: /lcm/v1/vnf/instances/notifications
+vevnfmadapter:
+  endpoint: http://so-ve-vnfm-adapter.onap:9098
 
 mso:
   key: 07a7159d3bf51a0e53be7a8f89699be7
@@ -31,10 +28,12 @@ aai:
   auth: 75C4483F9C05E2C33A8602635FA532397EC44AB667A2B64DED4FEE08DD932F2E3C1FEE
 
 vnfm:
+  default-endpoint: https://so-vnfm-simulator.onap:9093
   subscription: /vnflcm/v1/subscriptions
+  notification: /lcm/v1/vnf/instances/notifications
 
 dmaap:
-  endpoint: http://message-router:30227
+  endpoint: http://message-router.onap:30227
   topic: /events/unauthenticated.DCAE_CL_OUTPUT
 
 spring:
diff --git a/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/controller/NotificationControllerTest.java b/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/controller/NotificationControllerTest.java
index 57638a165a..974e6ec544 100644
--- a/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/controller/NotificationControllerTest.java
+++ b/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/controller/NotificationControllerTest.java
@@ -53,8 +53,8 @@ public class NotificationControllerTest {
     private static final String MINIMAL_JSON_CONTENT = "{}";
     private static final int ZERO = 0;
 
-    @Value("${notification.url}")
-    private String notificationUrl;
+    @Value("${vnfm.notification}")
+    private String notification;
 
     @Autowired
     private WebApplicationContext webApplicationContext;
@@ -74,7 +74,7 @@ public class NotificationControllerTest {
     @Test
     public void testReceiveNotification() throws Exception {
         // given
-        final MockHttpServletRequestBuilder request = MockMvcRequestBuilders.post(notificationUrl)
+        final MockHttpServletRequestBuilder request = MockMvcRequestBuilders.post(notification)
                 .contentType(MediaType.APPLICATION_JSON).content(MINIMAL_JSON_CONTENT);
 
         mockRestServer.expect(once(), anything()).andRespond(withSuccess());
diff --git a/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/provider/AuthorizationHeadersProviderTest.java b/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/provider/AuthorizationHeadersProviderTest.java
index 64503ddfc2..f9ae427086 100644
--- a/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/provider/AuthorizationHeadersProviderTest.java
+++ b/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/provider/AuthorizationHeadersProviderTest.java
@@ -28,6 +28,8 @@ import org.springframework.http.HttpHeaders;
 public class AuthorizationHeadersProviderTest {
 
     private static final String AUTHORIZATION_EXAMPLE = "authorization";
+    private static final String BLANK_EXAMPLE = "\t\n";
+    private static final String EMPTY = "";
 
     private final AuthorizationHeadersProvider provider = new AuthorizationHeadersProvider();
 
@@ -44,4 +46,41 @@ public class AuthorizationHeadersProviderTest {
         assertEquals(size, headers.size());
         assertFalse(headers.containsKey(AUTHORIZATION_HEADER));
     }
+
+    @Test
+    public void testBlankAuthorization() {
+        final HttpHeaders headers = provider.getHttpHeaders();
+        final int size = headers.size();
+
+        provider.addAuthorization(BLANK_EXAMPLE);
+        assertEquals(size, headers.size());
+    }
+
+    @Test
+    public void testEmptyAuthorization() {
+        final HttpHeaders headers = provider.getHttpHeaders();
+        final int size = headers.size();
+
+        provider.addAuthorization(EMPTY);
+        assertEquals(size, headers.size());
+    }
+
+    @Test
+    public void testNullAuthorization() {
+        final HttpHeaders headers = provider.getHttpHeaders();
+        final int size = headers.size();
+
+        provider.addAuthorization(null);
+        assertEquals(size, headers.size());
+    }
+
+    @Test
+    public void testRemoveAuthorization() {
+        final HttpHeaders headers = provider.getHttpHeaders();
+        final int size = headers.size();
+
+        provider.removeAuthorization();
+        provider.removeAuthorization();
+        assertEquals(size, headers.size());
+    }
 }
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 0f9c23e261..d1d34a706f 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
@@ -20,7 +20,9 @@
 
 package org.onap.so.adapters.vevnfm.service;
 
-import static org.mockito.Mockito.*;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -30,62 +32,34 @@ import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.aai.domain.yang.EsrSystemInfo;
 import org.onap.so.adapters.vevnfm.aai.AaiConnection;
-import org.onap.so.adapters.vevnfm.exception.VeVnfmException;
 
 @RunWith(MockitoJUnitRunner.class)
 public class StartupServiceTest {
 
-    @Mock
-    private AaiConnection aaiConnection;
+    private static final String URL = "rt";
+
+    @Rule
+    public ExpectedException thrown = ExpectedException.none();
 
     @Mock
-    private SubscriberService subscriberService;
+    private AaiConnection aaiConnection;
 
     @InjectMocks
     private StartupService startupService;
 
-    @Rule
-    public ExpectedException thrown = ExpectedException.none();
-
     @Test
     public void testSuccess() throws Exception {
         // given
         final EsrSystemInfo info = new EsrSystemInfo();
-        info.setServiceUrl("lh");
-        when(aaiConnection.receiveVnfm()).thenReturn(info);
-        when(subscriberService.subscribe(info)).thenReturn(true);
-
-        // when
-        startupService.run();
-
-        // then
-        verify(aaiConnection, times(1)).receiveVnfm();
-        verify(subscriberService, times(1)).subscribe(info);
-    }
+        info.setServiceUrl(URL);
 
-    @Test
-    public void testFailureAai() throws Exception {
-        // given
-        final EsrSystemInfo info = new EsrSystemInfo();
         when(aaiConnection.receiveVnfm()).thenReturn(info);
 
-        thrown.expect(VeVnfmException.class);
-
         // when
-        startupService.run();
-    }
-
-    @Test
-    public void testFailureSubscriber() throws Exception {
-        // given
-        final EsrSystemInfo info = new EsrSystemInfo();
-        info.setServiceUrl("lh");
-        when(aaiConnection.receiveVnfm()).thenReturn(info);
-        when(subscriberService.subscribe(info)).thenReturn(false);
+        final EsrSystemInfo systemInfo = startupService.receiveVnfm();
 
-        thrown.expect(VeVnfmException.class);
-
-        // when
-        startupService.run();
+        // then
+        verify(aaiConnection).receiveVnfm();
+        assertEquals(info, systemInfo);
     }
 }
diff --git a/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/subscription/SubscribeSenderTest.java b/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/SubscribeSenderTest.java
similarity index 85%
rename from adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/subscription/SubscribeSenderTest.java
rename to adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/SubscribeSenderTest.java
index d1fda0eee6..b7f1f982a2 100644
--- a/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/subscription/SubscribeSenderTest.java
+++ b/adapters/mso-ve-vnfm-adapter/src/test/java/org/onap/so/adapters/vevnfm/service/SubscribeSenderTest.java
@@ -18,9 +18,10 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.so.adapters.vevnfm.subscription;
+package org.onap.so.adapters.vevnfm.service;
 
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
+import static org.onap.so.adapters.vevnfm.service.SubscribeSender.SLASH;
 import static org.springframework.http.HttpHeaders.CONTENT_TYPE;
 import static org.springframework.test.web.client.ExpectedCount.once;
 import static org.springframework.test.web.client.match.MockRestRequestMatchers.*;
@@ -33,6 +34,7 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.onap.aai.domain.yang.EsrSystemInfo;
 import org.onap.so.adapters.vevnfm.configuration.StartupConfiguration;
+import org.onap.so.adapters.vevnfm.exception.VeVnfmException;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.LccnSubscriptionRequest;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -50,8 +52,9 @@ import org.springframework.web.client.RestTemplate;
 @ActiveProfiles(StartupConfiguration.TEST_PROFILE)
 public class SubscribeSenderTest {
 
-    private static final String SLASH = "/";
-    private static final String MINIMAL_JSON_CONTENT = "{}";
+    private static final String URL = "lh";
+    private static final String ID = "1a2s3d4f";
+    private static final String JSON = "{\"id\":\"" + ID + "\"}";
 
     private static final Gson GSON;
 
@@ -78,22 +81,22 @@ public class SubscribeSenderTest {
     }
 
     @Test
-    public void testSuccess() {
+    public void testSuccess() throws VeVnfmException {
         // given
         final EsrSystemInfo info = new EsrSystemInfo();
-        info.setServiceUrl("lh");
+        info.setServiceUrl(URL);
         final LccnSubscriptionRequest request = new LccnSubscriptionRequest();
 
         mockRestServer.expect(once(), requestTo(SLASH + info.getServiceUrl() + vnfmSubscription))
                 .andExpect(header(CONTENT_TYPE, CoreMatchers.containsString(MediaType.APPLICATION_JSON_VALUE)))
                 .andExpect(method(HttpMethod.POST)).andExpect(content().json(GSON.toJson(request)))
-                .andRespond(withStatus(HttpStatus.CREATED).body(MINIMAL_JSON_CONTENT));
+                .andRespond(withStatus(HttpStatus.CREATED).body(JSON).contentType(MediaType.APPLICATION_JSON));
 
         // when
-        final boolean done = sender.send(info, request);
+        final String id = sender.send(info, request);
 
         // then
-        assertTrue(done);
         mockRestServer.verify();
+        assertEquals(ID, id);
     }
 }