Add Tests for VNF Package Mgmt - Subscribe and Notify
[integration/csit.git] / plans / so / integration-etsi-testing / so-simulators / vnfm-simulator / vnfm-service / src / main / java / org / onap / so / svnfm / simulator / controller / SubscriptionNotificationController.java
index 2c6b8f2..1db20fa 100644 (file)
 package org.onap.so.svnfm.simulator.controller;
 
 import javax.ws.rs.core.MediaType;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gson.TypeAdapter;
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonWriter;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.InlineResponse201;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.PkgmSubscriptionRequest;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsAuthentication;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsAuthentication.AuthTypeEnum;
 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsAuthenticationParamsBasic;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.notification.model.VnfPackageChangeNotification;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.notification.model.VnfPackageOnboardingNotification;
 import org.onap.so.svnfm.simulator.constants.Constant;
 import org.onap.so.svnfm.simulator.services.SubscriptionManager;
+import org.onap.so.svnfm.simulator.services.providers.VnfPkgOnboardingNotificationCacheServiceProviderImpl;
 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.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Optional;
 
 /**
  * @author Eoin Hanan (eoin.hanan@est.tech)
@@ -47,10 +63,18 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 @RequestMapping(path = Constant.PACKAGE_MANAGEMENT_BASE_URL, produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
 public class SubscriptionNotificationController {
+
+    private static final Logger logger = LoggerFactory.getLogger(SubscriptionNotificationController.class);
+    private final Gson gson;
     @Autowired
     private SubscriptionManager subscriptionManager;
+    @Autowired
+    private VnfPkgOnboardingNotificationCacheServiceProviderImpl vnfPkgOnboardingNotificationCacheServiceProvider;
 
-    private static final Logger logger = LoggerFactory.getLogger(SubscriptionNotificationController.class);
+    @Autowired
+    public SubscriptionNotificationController() {
+        this.gson = new GsonBuilder().registerTypeAdapter(LocalDateTime.class, new LocalDateTimeTypeAdapter()).create();
+    }
 
     @Value("${spring.security.usercredentials[0].username}")
     private String username;
@@ -99,9 +123,94 @@ public class SubscriptionNotificationController {
      * @return
      */
     @PostMapping(value = Constant.NOTIFICATION_ENDPOINT, produces = {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
-    public ResponseEntity<?> postVnfPackageNotification(@RequestBody Object notification){
+    public ResponseEntity<?> postVnfPackageNotification(@RequestBody final Object notification){
         logger.info("Vnf Notification received:\n{}", notification);
+        final String notificationString = gson.toJson(notification);
+        addNotificationObjectToCache(notificationString);
         return ResponseEntity.noContent().build();
     }
 
+    /**
+     * Testing endpoint for checking that notifications have been received
+     *
+     * @param vnfPkgId
+     * @return
+     */
+    @GetMapping(value = Constant.NOTIFICATION_CACHE_TEST_ENDPOINT)
+    public ResponseEntity<?> getVnfPackageNotification(@PathVariable("vnfPkgId") final String vnfPkgId) {
+        logger.info("Getting notification with vnfPkgId: {}", vnfPkgId);
+        final Optional<VnfPackageOnboardingNotification> optionalVnfPackageOnboardingNotification =
+                vnfPkgOnboardingNotificationCacheServiceProvider.getVnfPkgOnboardingNotification(vnfPkgId);
+        if(optionalVnfPackageOnboardingNotification.isPresent()) {
+            VnfPackageOnboardingNotification vnfPackageOnboardingNotification =
+                    optionalVnfPackageOnboardingNotification.get();
+            logger.info("Return notification with vnfPkgId: {} and body {}", vnfPkgId, vnfPackageOnboardingNotification);
+            return ResponseEntity.ok().body(vnfPackageOnboardingNotification);
+        }
+        final String errorMessage = "No notification found with vnfPkgId: " + vnfPkgId;
+        logger.error(errorMessage);
+        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(errorMessage);
+    }
+
+    private void addNotificationObjectToCache(final String notification) {
+        logger.info("addNotificationObjectToCache(): {}", notification);
+        final String notificationType = getNotificationType(notification);
+        if (VnfPackageOnboardingNotification.NotificationTypeEnum.VNFPACKAGEONBOARDINGNOTIFICATION.getValue()
+                .equals(notificationType)) {
+            final VnfPackageOnboardingNotification pkgOnboardingNotification =
+                    gson.fromJson(notification, VnfPackageOnboardingNotification.class);
+            logger.info("Onboarding notification received:\n{}", pkgOnboardingNotification);
+            final String vnfPkgId = pkgOnboardingNotification.getVnfPkgId();
+            vnfPkgOnboardingNotificationCacheServiceProvider.addVnfPkgOnboardingNotification(vnfPkgId, pkgOnboardingNotification);
+        } else if (VnfPackageChangeNotification.NotificationTypeEnum.VNFPACKAGECHANGENOTIFICATION.getValue()
+                .equals(notificationType)) {
+            final VnfPackageChangeNotification pkgChangeNotification =
+                    gson.fromJson(notification, VnfPackageChangeNotification.class);
+            logger.info("Change notification received:\n{}", pkgChangeNotification);
+        } else {
+            final String errorMessage = "An error occurred.  Notification type not supported for: " + notificationType;
+            logger.error(errorMessage);
+            throw new RuntimeException(errorMessage);
+        }
+    }
+
+    private String getNotificationType(final String notification) {
+        try {
+            logger.info("getNotificationType() notification: {}", notification);
+            final JsonParser parser = new JsonParser();
+            final JsonObject element = (JsonObject) parser.parse(notification);
+            return element.get("notificationType").getAsString();
+        } catch (final Exception e) {
+            logger.error("An error occurred processing notificiation: {}", e.getMessage());
+        }
+        throw new RuntimeException(
+                "Unable to parse notification type in object \n" + notification);
+    }
+
+    public static class LocalDateTimeTypeAdapter extends TypeAdapter<LocalDateTime> {
+
+        private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+        @Override
+        public void write(final JsonWriter out, final LocalDateTime localDateTime) throws IOException {
+            if (localDateTime == null) {
+                out.nullValue();
+            } else {
+                out.value(FORMATTER.format(localDateTime));
+            }
+        }
+
+        @Override
+        public LocalDateTime read(final JsonReader in) throws IOException {
+            switch (in.peek()) {
+                case NULL:
+                    in.nextNull();
+                    return null;
+                default:
+                    final String dateTime = in.nextString();
+                    return LocalDateTime.parse(dateTime, FORMATTER);
+            }
+        }
+    }
+
 }