Added VNFM Simulator project

Change-Id: I9b84164dc189128eed8d09b6ce69fc5d5fd78348
Issue-ID: SO-1618
Signed-off-by: rokenny <ronan.kenny@est.tech>
diff --git a/vnfm-simulator/vnf-service/pom.xml b/vnfm-simulator/vnf-service/pom.xml
new file mode 100644
index 0000000..9a6825c
--- /dev/null
+++ b/vnfm-simulator/vnf-service/pom.xml
@@ -0,0 +1,78 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.onap.vnfm</groupId>
+		<artifactId>vnfm-simulator</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<artifactId>vnf-service</artifactId>
+
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<java.version>1.8</java.version>
+	</properties>
+
+	<dependencies>
+
+		<dependency>
+			<groupId>org.onap.vnfm</groupId>
+			<artifactId>vnfm-api</artifactId>
+			<version>${project.version}</version>
+
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-web</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-actuator</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-test</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>io.swagger</groupId>
+			<artifactId>swagger-jaxrs</artifactId>
+			<version>1.5.0</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.directory.studio</groupId>
+			<artifactId>org.apache.commons.io</artifactId>
+			<version>2.4</version>
+		</dependency>
+		<dependency>
+			<groupId>com.googlecode.json-simple</groupId>
+			<artifactId>json-simple</artifactId>
+			<version>1.1.1</version>
+		</dependency>
+
+		<dependency>
+			<groupId>io.springfox</groupId>
+			<artifactId>springfox-swagger-ui</artifactId>
+			<version>2.6.1</version>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>io.springfox</groupId>
+			<artifactId>springfox-swagger2</artifactId>
+			<version>2.6.1</version>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>com.fasterxml.jackson.core</groupId>
+			<artifactId>jackson-databind</artifactId>
+			<version>2.9.8</version>
+		</dependency>
+
+	</dependencies>
+</project>
\ No newline at end of file
diff --git a/vnfm-simulator/vnf-service/src/main/java/org/onap/svnfm/simulator/controller/SvnfmController.java b/vnfm-simulator/vnf-service/src/main/java/org/onap/svnfm/simulator/controller/SvnfmController.java
new file mode 100644
index 0000000..b9703b3
--- /dev/null
+++ b/vnfm-simulator/vnf-service/src/main/java/org/onap/svnfm/simulator/controller/SvnfmController.java
@@ -0,0 +1,69 @@
+/*-
+ * ============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.svnfm.simulator.controller;
+
+import javax.ws.rs.core.MediaType;
+
+import org.onap.svnfm.simulator.services.SvnfmService;
+import org.onap.vnfm.v1.model.CreateVnfRequest;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * This class contains the VNF life cycle management operations
+ * 
+ * @author ronan.kenny@est.tech
+ *
+ */
+
+/**
+ * TO DO
+ *
+ * Implement Exception handling Implement VNFM adaptor call Identify the Create
+ * VNF response Test itwith the VNFM Adaptor
+ */
+
+@RestController
+@RequestMapping("/svnfm")
+
+public class SvnfmController {
+
+	@Autowired
+	private SvnfmService svnfmService;
+
+	private static final Logger LOGGER = LoggerFactory.getLogger(SvnfmController.class);
+
+	@RequestMapping(method = RequestMethod.POST, value = "/vnf_instances")
+	public ResponseEntity<Object> createVNFInstance(@RequestBody final CreateVnfRequest createVNFRequest) {
+		LOGGER.info("Start createVNFInstance");
+		HttpHeaders headers = new HttpHeaders();
+		headers.add("Content-Type", MediaType.APPLICATION_JSON);
+		return new ResponseEntity<>(svnfmService.createVNF(), headers, HttpStatus.CREATED);
+	}
+}
diff --git a/vnfm-simulator/vnf-service/src/main/java/org/onap/svnfm/simulator/controller/SvnfmHealthcheck.java b/vnfm-simulator/vnf-service/src/main/java/org/onap/svnfm/simulator/controller/SvnfmHealthcheck.java
new file mode 100644
index 0000000..e6f55f6
--- /dev/null
+++ b/vnfm-simulator/vnf-service/src/main/java/org/onap/svnfm/simulator/controller/SvnfmHealthcheck.java
@@ -0,0 +1,58 @@
+/*-
+ * ============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.svnfm.simulator.controller;
+
+import org.onap.svnfm.simulator.exception.InvalidRestRequestException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * TO DO
+ *
+ * Implement Exception handling 
+ * Implement VNFM adaptor call 
+ * Identify the Create VNF response 
+ * Test it with the VNFM Adaptor
+ */
+
+@RestController
+@RequestMapping("/svnfm")
+public class SvnfmHealthcheck {
+    
+    private static final Logger LOGGER = LoggerFactory.getLogger(SvnfmHealthcheck.class);
+
+    @RequestMapping(method = RequestMethod.GET, value = "/healthcheck")
+    public ResponseEntity<String> healthCheck() {
+        try {
+            return new ResponseEntity<>(HttpStatus.OK);
+        } catch (final InvalidRestRequestException extensions) {
+            final String message = "Not Found";
+            LOGGER.error(message);
+            return new ResponseEntity<>(message, HttpStatus.NOT_FOUND);
+        }
+    }
+}
diff --git a/vnfm-simulator/vnf-service/src/main/java/org/onap/svnfm/simulator/exception/GlobalExceptionHandler.java b/vnfm-simulator/vnf-service/src/main/java/org/onap/svnfm/simulator/exception/GlobalExceptionHandler.java
new file mode 100644
index 0000000..a06f2d2
--- /dev/null
+++ b/vnfm-simulator/vnf-service/src/main/java/org/onap/svnfm/simulator/exception/GlobalExceptionHandler.java
@@ -0,0 +1,27 @@
+package org.onap.svnfm.simulator.exception;
+
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.web.HttpMediaTypeNotSupportedException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.context.request.WebRequest;
+import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
+
+@ControllerAdvice
+public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
+	@Override
+	protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex,
+			HttpHeaders headers, HttpStatus status, WebRequest request) {
+		String error = "Malformed JSON request";
+		return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
+	}
+
+	@Override
+	protected ResponseEntity<Object> handleHttpMediaTypeNotSupported(HttpMediaTypeNotSupportedException ex,
+			HttpHeaders headers, HttpStatus status, WebRequest request) {
+		String error = "Media type Not Supported";
+		return new ResponseEntity<>(error, HttpStatus.UNSUPPORTED_MEDIA_TYPE);
+	}
+}
diff --git a/vnfm-simulator/vnf-service/src/main/java/org/onap/svnfm/simulator/exception/InvalidRestRequestException.java b/vnfm-simulator/vnf-service/src/main/java/org/onap/svnfm/simulator/exception/InvalidRestRequestException.java
new file mode 100644
index 0000000..eabd4ec
--- /dev/null
+++ b/vnfm-simulator/vnf-service/src/main/java/org/onap/svnfm/simulator/exception/InvalidRestRequestException.java
@@ -0,0 +1,37 @@
+/*-
+ * ============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.svnfm.simulator.exception;
+
+/**
+ * @author ronan.kenny@est.tech
+ *
+ */
+public class InvalidRestRequestException extends RuntimeException {
+
+    private static final long serialVersionUID = 3977807111893986938L;
+
+    public InvalidRestRequestException(final String message) {
+        super(message);
+    }
+
+    public InvalidRestRequestException(final String message, final Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/vnfm-simulator/vnf-service/src/main/java/org/onap/svnfm/simulator/exception/RestProcessingException.java b/vnfm-simulator/vnf-service/src/main/java/org/onap/svnfm/simulator/exception/RestProcessingException.java
new file mode 100644
index 0000000..c84416e
--- /dev/null
+++ b/vnfm-simulator/vnf-service/src/main/java/org/onap/svnfm/simulator/exception/RestProcessingException.java
@@ -0,0 +1,37 @@
+/*-
+ * ============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.svnfm.simulator.exception;
+
+/**
+ * @author ronan.kenny@est.tech
+ *
+ */
+public class RestProcessingException extends RuntimeException {
+
+    private static final long serialVersionUID = 16862313537198441L;
+
+    public RestProcessingException(final String message) {
+        super(message);
+    }
+
+    public RestProcessingException(final String message, final Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/vnfm-simulator/vnf-service/src/main/java/org/onap/svnfm/simulator/services/SvnfmService.java b/vnfm-simulator/vnf-service/src/main/java/org/onap/svnfm/simulator/services/SvnfmService.java
new file mode 100644
index 0000000..e2dc43a
--- /dev/null
+++ b/vnfm-simulator/vnf-service/src/main/java/org/onap/svnfm/simulator/services/SvnfmService.java
@@ -0,0 +1,60 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 Ericsson. 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.
+ * 
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.svnfm.simulator.services;
+
+import java.io.IOException;
+
+import org.apache.commons.io.IOUtils;
+import org.onap.svnfm.simulator.notifications.VnfmAdapterCreationNotification;
+import org.onap.vnfm.v1.model.InlineResponse201;
+import org.springframework.stereotype.Service;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * This class handles the logic of VNF lifecycle
+ * 
+ * @author Lathishbabu Ganesan (lathishbabu.ganesan@est.tech)
+ *
+ */
+@Service
+public class SvnfmService {
+
+	/**
+	 * This method read the create VNF response from the json file and return it
+	 * to the VNFM Adaptor
+	 * 
+	 * @return
+	 */
+	public InlineResponse201 createVNF() {
+		Thread creationNodtification = new Thread(new VnfmAdapterCreationNotification());
+		creationNodtification.start();
+		ObjectMapper mapper = new ObjectMapper();
+		InlineResponse201 inlineResponse201 = null;
+		try {
+			inlineResponse201 = mapper.readValue(
+					IOUtils.toString(getClass().getClassLoader().getResource("json/createVNFResponse.json")),
+					InlineResponse201.class);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return inlineResponse201;
+	}
+}
diff --git a/vnfm-simulator/vnf-service/src/main/resources/json/createVNFResponse.json b/vnfm-simulator/vnf-service/src/main/resources/json/createVNFResponse.json
new file mode 100644
index 0000000..a66bcc1
--- /dev/null
+++ b/vnfm-simulator/vnf-service/src/main/resources/json/createVNFResponse.json
@@ -0,0 +1,19 @@
+{
+     "id": "147d9468-4646-11e9-80af-fa163e169afd",
+     "vnfInstanceName": "MME85_8.EricssonMMEVSPV2_0",
+     "vnfInstanceDescription": "2f3e21dd-99ba-45b1-b4da-1f71283c46f6",
+     "vnfdId": "sgsn-mme_onapmme01_cxp9025898_4r85d01",
+     "vnfProvider": "Ericsson",
+     "vnfProductName": "SGSN-MME",
+     "vnfSoftwareVersion": "1.24 (CXS101289_R85D01)",
+     "vnfdVersion": "onapmme01_cxp9025898_4r85d01",
+     "vnfPkgId": null,
+     "vnfConfigurableProperties": null,
+     "vimConnectionInfo": null,
+     "instantiationState": "NOT_INSTANTIATED",
+     "instantiatedVnfInfo": null,
+     "metadata": null,
+     "extensions": null,
+     "links": null
+
+}