Add MSB service register funtion 61/16061/1
authoryufei_zhou <yufei.zhou@nokia-sbell.com>
Thu, 28 Sep 2017 09:39:00 +0000 (02:39 -0700)
committeryufei_zhou <yufei.zhou@nokia-sbell.com>
Thu, 28 Sep 2017 09:39:00 +0000 (02:39 -0700)
Change-Id: I2ffe7634052c93ce3c287aa996877610f3a46f4c
Issue-ID: VFC-53
Signed-off-by: yufei_zhou <yufei.zhou@nokia-sbell.com>
nokia/vnfmdriver/vfcadaptorservice/deployment/src/main/release/README.txt
nokia/vnfmdriver/vfcadaptorservice/vfcadaptor/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/common/bo/AdaptorEnv.java
nokia/vnfmdriver/vfcadaptorservice/vfcadaptor/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/constant/CommonConstants.java
nokia/vnfmdriver/vfcadaptorservice/vfcadaptor/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/msb/impl/MsbMgmrImpl.java [new file with mode: 0644]
nokia/vnfmdriver/vfcadaptorservice/vfcadaptor/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/msb/inf/IMsbMgmr.java [new file with mode: 0644]
nokia/vnfmdriver/vfcadaptorservice/vfcadaptor/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/msb/service/MsgServiceRegister.java [new file with mode: 0644]
nokia/vnfmdriver/vfcadaptorservice/vfcadaptor/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/vnfmdriver/controller/VnfmDriverController.java
nokia/vnfmdriver/vfcadaptorservice/vfcadaptor/src/main/resources/application.properties
nokia/vnfmdriver/vfcadaptorservice/vfcadaptor/src/main/resources/register.properties [new file with mode: 0644]
nokia/vnfmdriver/vfcadaptorservice/vfcadaptor/src/main/resources/swagger.json [new file with mode: 0644]

index fa97d7e..6681c16 100644 (file)
@@ -31,6 +31,8 @@ Configuration steps:
     - Update the VNFM address in 'application.properties' under webapps directory.
     - Update the Catalog address in 'application.properties' under webapps directory.
     - Update the NSLCM address in 'application.properties' under webapps directory.
+    - Update the MSB address in $PATH/etc/conf/restclient.json
+    - Update the vnfmadapter service ip address in $PATH/etc/adapterInfo/vnfmadapterinfo.json
 
 
 How to run?
@@ -43,7 +45,7 @@ How to run?
           'conf/server.xml'
           - Verify that 'Tomcat started.' is reported on the console.
     - Once service is started, please verify below details:
-        - from MSB service, verify that "nokiavnfm"  is reported from GET request on "/openoapi/microservices/v1/services"
+        - from MSB service, verify that "nokia-vnfm-driver"  is reported from GET request on "/openoapi/microservices/v1/services"
         - from this service, run one of the supported REST API mentioned in open-o NFVO wiki and verify that the
           expected response is returned.
 How to stop?
index 9345432..343e517 100644 (file)
@@ -23,16 +23,23 @@ import org.springframework.stereotype.Component;
 public class AdaptorEnv {
        @Value("${nslcmApiUriFront}")
        private String nslcmApiUriFront;
+       
        @Value("${catalogApiUriFront}")
        private String catalogApiUriFront;
+       
        @Value("${cbamApiUriFront}")
        private String cbamApiUriFront;
        
+       @Value("${msbApiUriFront}")
+       private String msbApiUriFront;
+       
        //for retrieving token from CBAM
        @Value("${grantType}")
        private String grantType;
+       
        @Value("${clientId}")
        private String clientId;
+       
        @Value("${clientSecret}")
        private String clientSecret;
        
@@ -72,5 +79,11 @@ public class AdaptorEnv {
        public void setClientSecret(String clientSecret) {
                this.clientSecret = clientSecret;
        }
+       public String getMsbApiUriFront() {
+               return msbApiUriFront;
+       }
+       public void setMsbApiUriFront(String msbApiUriFront) {
+               this.msbApiUriFront = msbApiUriFront;
+       }
        
 }
index c145e28..22c06ef 100644 (file)
@@ -57,4 +57,9 @@ public class CommonConstants {
        
        public static final String CBAM_OPERATION_STATUS_START = "start";
        public static final String CBAM_OPERATION_STATUS_FINISH = "finished";
+       
+       //MSB
+       public static final String MSB_REGISTER_SERVICE_PATH = "/api/microservices/v1/services";
+//     public static final String MSB_REGISTER_SERVICE_PATH = "/api/microservices/v1/services/{serviceName}/version/{version}/nodes/{ip}/{port}";
+       public static final String MSB_UNREGISTER_SERVICE_PATH = "/api/microservices/v1/services/%s/version/%s/nodes/%s/%s";
 }
diff --git a/nokia/vnfmdriver/vfcadaptorservice/vfcadaptor/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/msb/impl/MsbMgmrImpl.java b/nokia/vnfmdriver/vfcadaptorservice/vfcadaptor/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/msb/impl/MsbMgmrImpl.java
new file mode 100644 (file)
index 0000000..ed85fcf
--- /dev/null
@@ -0,0 +1,168 @@
+/*
+ * Copyright 2016-2017, Nokia Corporation
+ *
+ * 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.
+ */
+
+package org.onap.vfc.nfvo.driver.vnfm.svnfm.msb.impl;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.onap.vfc.nfvo.driver.vnfm.svnfm.common.bo.AdaptorEnv;
+import org.onap.vfc.nfvo.driver.vnfm.svnfm.constant.CommonConstants;
+import org.onap.vfc.nfvo.driver.vnfm.svnfm.http.client.HttpRequestProcessor;
+import org.onap.vfc.nfvo.driver.vnfm.svnfm.msb.inf.IMsbMgmr;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.util.ResourceUtils;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@Component
+public class MsbMgmrImpl implements IMsbMgmr {
+       private static final Logger logger = LogManager.getLogger("MsbMgmrImpl");
+       @Autowired 
+       private HttpClientBuilder httpClientBuilder;
+       
+       @Autowired 
+       private AdaptorEnv adaptorEnv;
+       
+       @Value("${serviceName}")
+       private String serviceName;
+       
+       @Value("${version}")
+       private String version;
+       
+       @Value("${url}")
+       private String url;
+       
+       @Value("${protocol}")
+       private String protocol;
+       
+       @Value("${visualRange}")
+       private String visualRange;
+       
+       @Value("${ip}")
+       private String ip;
+       
+       @Value("${port}")
+       private String port;
+       
+       @Value("${ttl}")
+       private String ttl;
+
+       @Override
+       public void register() {
+               String httpPath = CommonConstants.MSB_REGISTER_SERVICE_PATH;
+               RequestMethod method = RequestMethod.POST;
+               
+               try {
+                       String jsonStr = readVfcAdaptorInfoFromJsonFile();
+                       String registerResponse = operateHttpTask(jsonStr, httpPath, method);
+                       logger.info("registerResponse is ", registerResponse); 
+               } catch (IOException e) {
+                       logger.error("Failed to read vfcadaptor info! ", e);
+               }
+                       
+       }
+       
+       public String readVfcAdaptorInfoFromJsonFile()  throws IOException {
+        InputStream ins = null;
+        BufferedInputStream bins = null;
+        String fileContent = "";
+        String fileName = getAppRoot() + "/etc/adapterInfo/vnfmadapterinfo.json";
+
+        try {
+            ins = new FileInputStream(fileName);
+            bins = new BufferedInputStream(ins);
+
+            byte[] contentByte = new byte[ins.available()];
+            int num = bins.read(contentByte);
+
+            if(num > 0) {
+                fileContent = new String(contentByte);
+            }
+        } catch(FileNotFoundException e) {
+               logger.error(fileName + "is not found!", e);
+        } finally {
+            if(ins != null) {
+                ins.close();
+            }
+            if(bins != null) {
+                bins.close();
+            }
+        }
+
+        return fileContent;
+    }
+
+       @Override
+       public void unregister() {
+               String httpPath = String.format(CommonConstants.MSB_UNREGISTER_SERVICE_PATH, serviceName, version, ip, port);
+               RequestMethod method = RequestMethod.DELETE;
+               
+               try {
+                       String jsonStr = readVfcAdaptorInfoFromJsonFile();
+                       String registerResponse = operateHttpTask(jsonStr, httpPath, method);
+                       logger.info("unregisterResponse is ", registerResponse); 
+               } catch (IOException e) {
+                       logger.error("Failed to unregister! ", e);
+               }
+
+       }
+       
+       public String operateHttpTask(String httpBodyObj, String httpPath, RequestMethod method) throws ClientProtocolException, IOException {
+               String url=adaptorEnv.getMsbApiUriFront() + httpPath;
+               HttpRequestProcessor processor = new HttpRequestProcessor(httpClientBuilder, method);
+               processor.addHdeader(CommonConstants.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
+               
+               processor.addPostEntity(httpBodyObj);
+               
+               String responseStr = processor.process(url);
+               
+               return responseStr;
+       }
+       
+    public String getAppRoot() {
+        String appRoot = null;
+        appRoot = System.getProperty("catalina.base");
+        if(appRoot != null) {
+            appRoot = getCanonicalPath(appRoot);
+        }
+        return appRoot;
+    }
+
+    private String getCanonicalPath(final String inPath) {
+        String path = null;
+        try {
+            if(inPath != null) {
+                final File file = new File(inPath);
+                path = file.getCanonicalPath();
+            }
+        } catch(final IOException e) {
+            logger.error("file.getCanonicalPath() IOException:", e);
+        }
+        return path;
+    }
+
+}
diff --git a/nokia/vnfmdriver/vfcadaptorservice/vfcadaptor/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/msb/inf/IMsbMgmr.java b/nokia/vnfmdriver/vfcadaptorservice/vfcadaptor/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/msb/inf/IMsbMgmr.java
new file mode 100644 (file)
index 0000000..aaabc3f
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2016-2017, Nokia Corporation
+ *
+ * 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.
+ */
+package org.onap.vfc.nfvo.driver.vnfm.svnfm.msb.inf;
+
+public interface IMsbMgmr {
+       public void register();
+       public void unregister();
+}
diff --git a/nokia/vnfmdriver/vfcadaptorservice/vfcadaptor/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/msb/service/MsgServiceRegister.java b/nokia/vnfmdriver/vfcadaptorservice/vfcadaptor/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/msb/service/MsgServiceRegister.java
new file mode 100644 (file)
index 0000000..5f52297
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2016-2017, Nokia Corporation
+ *
+ * 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.
+ */
+package org.onap.vfc.nfvo.driver.vnfm.svnfm.msb.service;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.onap.vfc.nfvo.driver.vnfm.svnfm.msb.inf.IMsbMgmr;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MsgServiceRegister implements ApplicationRunner{
+       private static final Logger logger = LogManager.getLogger("MsgServiceRegister");
+       
+       @Autowired
+       private IMsbMgmr msbMgmr;
+
+       @Override
+       public void run(ApplicationArguments arg0) {
+               msbMgmr.register();
+               logger.info("nokia vnfm driver successfully registered on the MSB");
+       }
+
+}
index a3aee38..39b6b3f 100644 (file)
@@ -47,7 +47,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import com.google.gson.Gson;
 
 @Controller
-@RequestMapping(value = "/nokiavnfm/v1")
+@RequestMapping(value = "/api/nokiavnfmdriver/v1")
 public class VnfmDriverController {
        private static final Logger logger = LogManager.getLogger("VnfmDriverController");
        
index 0ae1288..225b04a 100644 (file)
@@ -35,8 +35,9 @@ logging.level.org.hibernate=ERROR
 
 ## common configuration for connections begin ##
 nslcmApiHttpFront=http://1.2.3.4:88
-catalogApiUriFront=http://1.2.6.7:88
-cbamApiUriFront=https://1.2.5.4:88
+catalogApiUriFront=http://2.2.3.4:88
+cbamApiUriFront=https://3.2.3.4:88
+msbApiUriFront=http://4.2.3.4:88
     
 ## for retrieving token from CBAM ##
 grantType=grantType1
diff --git a/nokia/vnfmdriver/vfcadaptorservice/vfcadaptor/src/main/resources/register.properties b/nokia/vnfmdriver/vfcadaptorservice/vfcadaptor/src/main/resources/register.properties
new file mode 100644 (file)
index 0000000..0492995
--- /dev/null
@@ -0,0 +1,23 @@
+###############################################################################
+# Copyright 2016, Nokia Corporation
+#
+# 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.
+###############################################################################
+serviceName=nokia-vnfm-driver
+version=v1
+url=/api/nokiavnfmdriver/v1
+protocol=HTTP
+visualRange=1
+ip=135.251.208.57
+port=8988
+ttl=0
\ No newline at end of file
diff --git a/nokia/vnfmdriver/vfcadaptorservice/vfcadaptor/src/main/resources/swagger.json b/nokia/vnfmdriver/vfcadaptorservice/vfcadaptor/src/main/resources/swagger.json
new file mode 100644 (file)
index 0000000..aeb6621
--- /dev/null
@@ -0,0 +1,608 @@
+{
+  "swagger": "2.0",
+  "info": {
+    "title": "Nokia VNFM Driver API",
+    "description": "VNF service provider.",
+    "version": "1.0.0"
+  },
+  "tags": [
+        {
+            "name": "Nokia VNFM Driver services"
+        }
+    ],
+  "basePath": "/api",
+  "paths": {
+    "/{vnfmtype}/v1/{vnfmid}/vnfs": {
+      "post": {
+        "summary": "Instantiate VNF",
+        "description": "Add VNF",
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "parameters": [
+          {
+            "name": "vnfmtype",
+            "in": "path",
+            "description": "vnfm type",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "vnfmid",
+            "in": "path",
+            "description": "vnfm id",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "in": "body",
+            "name": "vnf",
+            "description": "Provide required properties of VNF.",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/Vnf"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "VNF Response",
+            "schema": {
+              "$ref": "#/definitions/VnfResponse"
+            }
+          },
+          "401": {
+            "description": "Unauthorized"
+          },
+          "404": {
+            "description": "VNF Not Found"
+          },
+          "500": {
+            "description": "VNF service failed to process the request",
+            "schema": {
+              "$ref": "#/definitions/Error"
+            }
+          }
+        }
+      }
+    },
+    "/{vnfmtype}/v1/{vnfmid}/vnfs/{vnfInstanceId}/terminate": {
+      "post": {
+        "summary": "Terminate VNF",
+        "description": "Delete VNF",
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "parameters": [
+          {
+            "name": "vnfmtype",
+            "in": "path",
+            "description": "vnfm type",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "vnfmid",
+            "in": "path",
+            "description": "vnfm id",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "vnfInstanceId",
+            "in": "path",
+            "description": "vnfm instance id",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "in": "body",
+            "name": "vnfTerminate",
+            "description": "Provide required properties of VNF.",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/VnfTerminate"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "VNF Response",
+            "schema": {
+              "$ref": "#/definitions/VnfTerminateResponse"
+            }
+          },
+          "401": {
+            "description": "Unauthorized"
+          },
+          "404": {
+            "description": "VNF Not Found"
+          },
+          "500": {
+            "description": "VNF service failed to process the request",
+            "schema": {
+              "$ref": "#/definitions/Error"
+            }
+          }
+        }
+      }
+    },
+    "/{vnfmtype}/v1/{vnfmid}/vnfs/{vnfInstanceId}": {
+      "get": {
+        "summary": "Query VNF",
+        "description": "Get VNF Details",
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "parameters": [
+          {
+            "name": "vnfmtype",
+            "in": "path",
+            "description": "vnfm type",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "vnfmid",
+            "in": "path",
+            "description": "vnfm id",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "vnfInstanceId",
+            "in": "path",
+            "description": "vnfm instance id",
+            "required": true,
+            "type": "string"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "VNF Response",
+            "schema": {
+              "$ref": "#/definitions/VnfInfoResponse"
+            }
+          },
+          "401": {
+            "description": "Unauthorized"
+          },
+          "404": {
+            "description": "VNF Not Found"
+          },
+          "500": {
+            "description": "VNF service failed to process the request",
+            "schema": {
+              "$ref": "#/definitions/Error"
+            }
+          }
+        }
+      }
+    },
+    "/{vnfmtype}/v1/jobs/{jobid}": {
+      "get": {
+        "summary": "Get VNF operational status",
+        "description": "VNF operational status",
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "parameters": [
+          {
+            "name": "vnfmtype",
+            "in": "path",
+            "description": "vnfm type",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "jobid",
+            "in": "path",
+            "description": "jobid",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "responseId",
+            "in": "query",
+            "description": "vnfm response id",
+            "required": true,
+            "type": "string"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "VNF Response",
+            "schema": {
+              "$ref": "#/definitions/VnfStatusResponse"
+            }
+          },
+          "401": {
+            "description": "Unauthorized"
+          },
+          "404": {
+            "description": "VNF Not Found"
+          },
+          "500": {
+            "description": "VNF service failed to process the request",
+            "schema": {
+              "$ref": "#/definitions/Error"
+            }
+          }
+        }
+      }
+    }
+  },
+  "definitions": {
+    "VnfStatusResponse": {
+      "type": "object",
+      "description": "Operational Status Response.",
+      "required": [
+        "jobId",
+        "responseDescriptor",
+        "status",
+        "progress",
+        "statusDescription",
+        "errorCode",
+        "responseId",
+        "responseHistoryList"
+      ],
+      "properties": {
+        "jobId": {
+          "type": "string",
+          "description": "Job ID"
+        },
+        "responseDescriptor": {
+          "type": "string",
+          "description": "Including vnfStatus, statusDescription, errorCode, progress, responseHistoryList, responseId."
+        },
+        "status": {
+          "type": "string",
+          "description": "JOB status started processing finished error"
+        },
+        "progress": {
+          "type": "integer",
+          "description": "Progress (1 - 100)"
+        },
+        "statusDescription": {
+          "type": "string",
+          "description": "Progress Description"
+        },
+        "errorCode": {
+          "type": "integer",
+          "description": "Errorcode"
+        },
+        "responseId": {
+          "type": "integer",
+          "description": "Response Identifier"
+        },
+        "responseHistoryList": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/HistoryDetails"
+          }
+        }
+      }
+    },
+    "HistoryDetails": {
+      "type": "object",
+      "description": "InitiateVnfResponse.",
+      "required": [
+        "vnfStatus",
+        "statusDescription",
+        "errorCode",
+        "progress",
+        "responseId"
+      ],
+      "properties": {
+        "vnfStatus": {
+          "type": "string",
+          "description": "Vnf Job Status."
+        },
+        "statusDescription": {
+          "type": "string",
+          "description": "Progress Description."
+        },
+        "errorCode": {
+          "type": "integer",
+          "description": "Error code."
+        },
+        "progress": {
+          "type": "integer",
+          "description": "progress (1-100)."
+        },
+        "responseId": {
+          "type": "integer",
+          "description": "Response Identifier."
+        }
+      }
+    },
+    "VnfResponse": {
+      "type": "object",
+      "description": "InitiateVnfResponse.",
+      "required": [
+        "jobId",
+        "vnfInstanceId"
+      ],
+      "properties": {
+        "jobId": {
+          "type": "string",
+          "description": "Identifier of the VNF lifecycle operation occurrence."
+        },
+        "vnfInstanceId": {
+          "type": "string",
+          "description": "Identifier of the VNF instance."
+        }
+      }
+    },
+    "VnfTerminateResponse": {
+      "type": "object",
+      "description": "TerminateVnfResponse.",
+      "required": [
+        "jobId"
+      ],
+      "properties": {
+        "jobId": {
+          "type": "string",
+          "description": "Identifier of the VNF lifecycle operation occurrence."
+        }
+      }
+    },
+    "VnfInfoResponse": {
+      "type": "object",
+      "description": "The information items about the selected VNF instance(s) that are returned..",
+      "required": [
+        "VnfInfo"
+      ],
+      "properties": {
+        "VnfInfo": {
+          "$ref": "#/definitions/VnfInfo"
+        }
+      }
+    },
+    "VnfInfo": {
+      "type": "object",
+      "description": "The information items about the selected VNF instance(s) that are returned..",
+      "required": [
+        "vnfInstanceId",
+        "vnfInstanceName",
+        "vnfInstanceDescription",
+        "vnfdId",
+        "vnfPackageId",
+        "version",
+        "vnfProvider",
+        "vnfType",
+        "vnfStatus"
+      ],
+      "properties": {
+        "vnfInstanceId": {
+          "type": "string",
+          "description": "VNF instance identifier."
+        },
+        "vnfInstanceName": {
+          "type": "string",
+          "description": "VNF instance name."
+        },
+        "vnfInstanceDescription": {
+          "type": "string",
+          "description": "Human-readable description of the VNF instance."
+        },
+        "vnfdId": {
+          "type": "string",
+          "description": "Identifier of the VNFD on which the VNF instance is based."
+        },
+        "vnfPackageId": {
+          "type": "string",
+          "description": "Identifier of the VNF Package used to manage the lifecycle of the VNF instance."
+        },
+        "version": {
+          "type": "string",
+          "description": "Version of the VNF."
+        },
+        "vnfProvider": {
+          "type": "string",
+          "description": "Name of the person or company providing the VNF."
+        },
+        "vnfType": {
+          "type": "string",
+          "description": "VNF Application Type."
+        },
+        "vnfStatus": {
+          "default": "active",
+          "enum": [
+            "inactive",
+            "active"
+          ],
+          "description": "The instantiation state of the VNF. Possible values:INACTIVE (Vnf is terminated or not instantiated ), ACTIVE (Vnf is instantiated). [instantiationState]."
+        }
+      }
+    },
+    "VnfTerminate": {
+      "type": "object",
+      "description": "Terminate VNF.",
+      "required": [
+        "terminationType",
+        "gracefulTerminationTimeout"
+      ],
+      "properties": {
+        "terminationType": {
+          "default": "forceful",
+          "enum": [
+            "forceful",
+            "graceful"
+          ],
+          "description": "Signals whether forceful or graceful termination is requested.."
+        },
+        "gracefulTerminationTimeout": {
+          "type": "integer",
+          "format": "int32",
+          "description": "The time interval (second) to wait for the VNF to be taken out of service during graceful termination, before shutting down the VNF and releasing the resources."
+        }
+      }
+    },
+    "Vnf": {
+      "type": "object",
+      "description": "VNF encapsulate an external IP for the given project in a domain. Each property description is provided with 1. required 2. update allowed 3. format. whenever its needs to be mentioned explicitly.",
+      "required": [
+        "vnfInstanceName",
+        "vnfPackageId",
+        "vnfDescriptorId",
+        "flavourId",
+        "vnfInstanceDescription",
+        "extVirtualLink"
+      ],
+      "properties": {
+        "vnfInstanceName": {
+          "type": "string",
+          "description": "Human-readable name of the VNF instance to be created.."
+        },
+        "vnfPackageId": {
+          "type": "string",
+          "description": "VNF packageId."
+        },
+        "vnfDescriptorId": {
+          "type": "string",
+          "description": "Information sufficient to identify the VNF Descriptor which defines the VNF to be created."
+        },
+        "flavourId": {
+          "type": "string",
+          "description": "verify."
+        },
+        "vnfInstanceDescription": {
+          "type": "string",
+          "description": "Human-readable description of the VNF instance to be created."
+        },
+        "extVirtualLink": {
+          "$ref": "#/definitions/ExtVirtualLinkData"
+        }
+      }
+    },
+    "ExtVirtualLinkData": {
+      "type": "object",
+      "description": "References to external virtual links to connect the VNF to.",
+      "required": [
+        "vlInstanceId",
+        "vim",
+        "networkId",
+        "cpdId"
+      ],
+      "properties": {
+        "vlInstanceId": {
+          "type": "string",
+          "description": "Identifier of the VL instance."
+        },
+        "vim": {
+          "$ref": "#/definitions/VimInfo"
+        },
+        "networkId": {
+          "type": "string",
+          "description": "The network UUID of network"
+        },
+        "cpdId": {
+          "type": "string",
+          "description": "Identifier of the external CPD in VNFD"
+        }
+      }
+    },
+    "VimInfo": {
+      "type": "object",
+      "description": "Information about the VIM that manages this resource.",
+      "required": [
+        "vimInfoId",
+        "vimId",
+        "interfaceInfo",
+        "accessInfo",
+        "interfaceEndpoint"
+      ],
+      "properties": {
+        "vimInfoId": {
+          "type": "string",
+          "description": "The identifier of this VimInfo instance, for the purpose of referencing it from other information elements."
+        },
+        "vimId": {
+          "type": "string",
+          "description": "The identifier of the VIM.."
+        },
+        "interfaceInfo": {
+          "$ref": "#/definitions/interfaceInfo"
+        },
+        "accessInfo": {
+          "$ref": "#/definitions/accessInfo"
+        },
+        "interfaceEndpoint": {
+          "type": "string",
+          "description": "Information about the interface endpoint. An example is a URL."
+        }
+      }
+    },
+    "interfaceInfo": {
+      "type": "object",
+      "description": "Information about the interface to the VIM, including VIM provider type, API version, and protocol type..",
+      "required": [
+        "vimType",
+        "apiVersion",
+        "protocolType"
+      ],
+      "properties": {
+        "vimType": {
+          "type": "string",
+          "description": "vim"
+        },
+        "apiVersion": {
+          "type": "string",
+          "description": "api version"
+        },
+        "protocolType": {
+          "type": "string",
+          "description": "Type of the protocol"
+        }
+      }
+    },
+    "accessInfo": {
+      "type": "object",
+      "description": "Authentication credentials for accessing the VIM. Examples may include those to support different authentication schemes, e.g., OAuth, Token, etc..",
+      "required": [
+        "tenant",
+        "username",
+        "password"
+      ],
+      "properties": {
+        "tenant": {
+          "type": "string",
+          "description": "Tenant Name of tenant"
+        },
+        "username": {
+          "type": "string",
+          "description": "Username for login"
+        },
+        "password": {
+          "type": "string",
+          "description": "Password of login user"
+        }
+      }
+    },
+    "Error": {
+      "type": "object",
+      "properties": {
+        "code": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "message": {
+          "type": "string"
+        }
+      }
+    }
+  }
+}
\ No newline at end of file