Merge "Add global-customer-id and service-type parameter"
authorFu Jinhua <fu.jinhua@zte.com.cn>
Wed, 11 Oct 2017 03:29:12 +0000 (03:29 +0000)
committerGerrit Code Review <gerrit@onap.org>
Wed, 11 Oct 2017 03:29:12 +0000 (03:29 +0000)
13 files changed:
docs/APIs/VNFLCM_API/index.rst
docs/delivery.rst
docs/installation.rst
lcm/ns/ns_create.py
lcm/ns/ns_delete.py
lcm/ns/views.py
lcm/ns/vls/create_vls.py
lcm/ns/vls/delete_vls.py
lcm/ns/vnfs/create_vnfs.py
lcm/ns/vnfs/terminate_nfs.py
lcm/pub/msapi/aai.py
pom.xml
version.properties

index 34c0990..1e679b1 100644 (file)
@@ -1,7 +1,7 @@
 VNF LCM API\r
----------\r
+------------\r
 \r
 .. toctree::\r
     :titlesonly:\r
 \r
-    VNFLCM_API
\ No newline at end of file
+    VNFLCM_API\r
index f31d396..9fa6fa8 100644 (file)
@@ -1,5 +1,5 @@
 VF-C Delivery
---------
+-------------
 VF-C includs the following components in R1.
 
 |image0|
index efdf816..c1d2b39 100644 (file)
@@ -2,7 +2,7 @@
 .. http://creativecommons.org/licenses/by/4.0
 
 VF-C Installation
-------------
+-----------------
 Describe the environment and steps to install VF-C components.
 
 
index e543581..26d0a7d 100644 (file)
@@ -26,8 +26,8 @@ logger = logging.getLogger(__name__)
 
 
 class CreateNSService(object):
-    def __init__(self, nsd_id, ns_name, description):
-        self.nsd_id = nsd_id
+    def __init__(self, csar_id, ns_name, description):
+        self.csar_id = csar_id
         self.ns_name = ns_name
         self.description = description
         self.ns_inst_id = ''
@@ -43,13 +43,14 @@ class CreateNSService(object):
         return self.ns_inst_id
 
     def check_nsd_valid(self):
-        logger.debug("CreateNSService::check_nsd_valid::nsd_id=%s" % self.nsd_id)
-        ns_package_info = query_nspackage_by_id(self.nsd_id)
+        logger.debug("CreateNSService::check_nsd_valid::csar_id=%s" % self.csar_id)
+        ns_package_info = query_nspackage_by_id(self.csar_id)
         if not ns_package_info:
-            raise NSLCMException("nsd(%s) not exists." % self.nsd_id)
+            raise NSLCMException("nsd(%s) not exists." % self.csar_id)
         packageInfo = ns_package_info["packageInfo"]
         self.ns_package_id = ignore_case_get(packageInfo, "nsPackageId")
-        logger.debug("CreateNSService::check_nsd_valid::ns_package_id=%s" % self.ns_package_id)
+        self.nsd_id = ignore_case_get(packageInfo, "nsdId")
+        logger.debug("CreateNSService::check_nsd_valid::ns_package_id=%s,nsd_id=%s", self.ns_package_id, self.nsd_id)
 
     def check_ns_inst_name_exist(self):
         is_exist = NSInstModel.objects.filter(name=self.ns_name).exists()
@@ -74,13 +75,13 @@ class CreateNSService(object):
             "service-subscriptions": {
                 "service-subscription": [
                     {
-                        "service-type": "service-type-" + self.ns_inst_id,
+                        "service-type": "Network",
                         "service-instances": {
                             "service-instance": [
                                 {
                                     "service-instance-id": self.ns_inst_id,
                                     "service-instance-name": self.ns_name,
-                                    "service-type": "service-type-" + self.ns_inst_id,
+                                    "service-type": "Network",
                                     "service-role": "service-role-" + self.ns_inst_id
                                 }
                             ]
index 52b0df8..dde89d1 100644 (file)
@@ -62,5 +62,5 @@ class DeleteNsService(object):
         if resp_data:
             logger.debug("Fail to delete ns instance[%s] from aai, resp_status: [%s]." % (self.ns_inst_id, resp_status))
         else:
-            logger.debug(
-                "Success to delete ns instance[%s] from aai, resp_status: [%s]." % (self.ns_inst_id, resp_status))
+            logger.debug("Success to delete ns instance[%s] from aai, resp_status: [%s]."
+                         % (self.ns_inst_id, resp_status))
index f7bb97a..6d19263 100644 (file)
@@ -53,11 +53,12 @@ class CreateNSView(APIView):
         logger.debug("Enter CreateNS: %s", request.data)
         if ignore_case_get(request.data, 'test') == "test":
             return Response(data={'nsInstanceId': "test"}, status=status.HTTP_201_CREATED)
-        nsd_id = ignore_case_get(request.data, 'nsdId')
+        # nsd_id = ignore_case_get(request.data, 'nsdId')
+        csar_id = ignore_case_get(request.data, 'csarId')
         ns_name = ignore_case_get(request.data, 'nsName')
         description = ignore_case_get(request.data, 'description')
         try:
-            ns_inst_id = CreateNSService(nsd_id, ns_name, description).do_biz()
+            ns_inst_id = CreateNSService(csar_id, ns_name, description).do_biz()
         except Exception as e:
             logger.error("Exception in CreateNS: %s", e.message)
             return Response(data={'error': e.message}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
index 1d89c3d..9d33838 100644 (file)
@@ -18,9 +18,11 @@ import traceback
 import uuid
 
 from lcm.ns.const import OWNER_TYPE
+from lcm.pub.config.config import REPORT_TO_AAI
 from lcm.pub.database.models import VLInstModel, NSInstModel, VNFFGInstModel
 from lcm.pub.exceptions import NSLCMException
 from lcm.pub.msapi import extsys, resmgr
+from lcm.pub.msapi.aai import create_network_aai
 from lcm.pub.nfvi.vim import const
 from lcm.pub.nfvi.vim import vimadaptor
 from lcm.pub.utils.values import ignore_case_get
@@ -54,6 +56,8 @@ class CreateVls(object):
             self.create_vl_to_vim()
             self.create_vl_to_resmgr()
             self.save_vl_to_db()
+            if REPORT_TO_AAI:
+                self.create_network_in_aai()
             return {"result": 0, "detail": "instantiation vl success", "vlId": self.vl_inst_id}
         except NSLCMException as e:
             return self.exception_handle(e)
@@ -132,13 +136,6 @@ class CreateVls(object):
             raise NSLCMException("Send post vl request to vim failed.")
         return vl_ret[1]
 
-    def save_vl_to_db(self):
-        VLInstModel(vlinstanceid=self.vl_inst_id, vldid=self.vld_id, vlinstancename=self.vl_inst_name,
-                    ownertype=self.owner_type, ownerid=self.owner_id, relatednetworkid=self.related_network_id,
-                    relatedsubnetworkid=self.related_subnetwork_id, vimid=self.vim_id, tenant=self.tenant).save()
-        # do_biz_with_share_lock("create-vllist-in-vnffg-%s" % self.owner_id, self.create_vl_inst_id_in_vnffg)
-        self.create_vl_inst_id_in_vnffg()
-
     def create_vl_to_resmgr(self):
         req_param = {
             "vlInstanceId": self.vl_inst_id,
@@ -189,3 +186,39 @@ class CreateVls(object):
                     vl_inst_id_str = vl_inst_id_str[:-1]
                     VNFFGInstModel.objects.filter(vnffgdid=vnffg_info["vnffg_id"], nsinstid=self.owner_id).update(
                         vllist=vl_inst_id_str)
+
+    def save_vl_to_db(self):
+        VLInstModel(vlinstanceid=self.vl_inst_id, vldid=self.vld_id, vlinstancename=self.vl_inst_name,
+                    ownertype=self.owner_type, ownerid=self.owner_id, relatednetworkid=self.related_network_id,
+                    relatedsubnetworkid=self.related_subnetwork_id, vimid=self.vim_id, tenant=self.tenant).save()
+        # do_biz_with_share_lock("create-vllist-in-vnffg-%s" % self.owner_id, self.create_vl_inst_id_in_vnffg)
+        self.create_vl_inst_id_in_vnffg()
+
+    def create_network_in_aai(self):
+        logger.debug("CreateVls::create_network_in_aai::report network[%s] to aai." % self.vl_inst_id)
+        data = {
+            "network-id": self.vl_inst_id,
+            "network-name": self.vl_inst_name,
+            "is-bound-to-vpn": "false",
+            "is-provider-network": "true",
+            "is-shared-network": "true",
+            "is-external-network": "true",
+            "relationship-list": {
+                "relationship": [
+                    {
+                        "related-to": "generic-vnf",
+                        "relationship-data": [
+                            {
+                                "relationship-key": "generic-vnf.vnf-id",
+                                "relationship-value": self.owner_id
+                            }
+                        ]
+                    }
+                ]
+            }
+        }
+        resp_data, resp_status = create_network_aai(self.vl_inst_id, data)
+        if resp_data:
+            logger.debug("Fail to create network[%s] to aai: [%s].", self.vl_inst_id, resp_status)
+        else:
+            logger.debug("Success to create network[%s] to aai: [%s].", self.vl_inst_id, resp_status)
index d2d8640..4ed7bc8 100644 (file)
 import logging
 import traceback
 
+from lcm.pub.config.config import REPORT_TO_AAI
 from lcm.pub.database.models import VLInstModel, VNFFGInstModel
 from lcm.pub.exceptions import NSLCMException
 from lcm.pub.msapi import resmgr, extsys
+from lcm.pub.msapi.aai import query_network_aai, delete_network_aai
 from lcm.pub.nfvi.vim import vimadaptor
 
 logger = logging.getLogger(__name__)
@@ -40,6 +42,8 @@ class DeleteVls(object):
             network_id = vl_inst_info[0].relatednetworkid
             self.delete_vl_from_vim(vim_id, subnetwork_id_list, network_id)
             self.delete_vl_from_resmgr()
+            if REPORT_TO_AAI:
+                self.delete_network_in_aai()
             self.delete_vl_from_db(vl_inst_info)
             return {"result": 0, "detail": "delete vl success"}
         except NSLCMException as e:
@@ -67,11 +71,6 @@ class DeleteVls(object):
             vim_api.delete_subnet(subnet_id=subnetwork_id)
         vim_api.delete_network(network_id=network_id)
 
-    def delete_vl_from_db(self, vl_inst_info):
-        # do_biz_with_share_lock("delete-vllist-in-vnffg-%s" % self.ns_inst_id, self.delete_vl_inst_id_in_vnffg)
-        self.delete_vl_inst_id_in_vnffg()
-        vl_inst_info.delete()
-
     def delete_vl_from_resmgr(self):
         resmgr.delete_vl(self.vl_inst_id)
 
@@ -83,3 +82,22 @@ class DeleteVls(object):
                     new_vl_id_list += old_vl_id + ","
             new_vl_id_list = new_vl_id_list[:-1]
             VNFFGInstModel.objects.filter(vnffginstid=vnffg_info.vnffginstid).update(vllist=new_vl_id_list)
+
+    def delete_network_in_aai(self):
+        logger.debug("DeleteVls::delete_network_in_aai::delete network[%s] in aai." % self.vl_inst_id)
+
+        # query network in aai, get resource_version
+        customer_info = query_network_aai(self.vl_inst_id)
+        resource_version = customer_info["resource-version"]
+
+        # delete network from aai
+        resp_data, resp_status = delete_network_aai(self.vl_inst_id, resource_version)
+        if resp_data:
+            logger.debug("Fail to delete network[%s] from aai, resp_status: [%s]." % (self.vl_inst_id, resp_status))
+        else:
+            logger.debug("Success to delete network[%s] from aai, resp_status: [%s]." % (self.vl_inst_id, resp_status))
+
+    def delete_vl_from_db(self, vl_inst_info):
+        # do_biz_with_share_lock("delete-vllist-in-vnffg-%s" % self.ns_inst_id, self.delete_vl_inst_id_in_vnffg)
+        self.delete_vl_inst_id_in_vnffg()
+        vl_inst_info.delete()
index caaefc2..f7b9491 100644 (file)
@@ -295,7 +295,7 @@ class CreateVnfs(Thread):
                             },
                             {
                                 "relationship-key": "service-subscription.service-type",
-                                "relationship-value": "service-type-" + self.ns_inst_id
+                                "relationship-value": "Network"
                             },
                             {
                                 "relationship-key": "service-instance.service-instance-id",
index c88e844..d641deb 100644 (file)
@@ -11,6 +11,7 @@
 # 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.
+
 import logging
 import traceback
 import json
@@ -142,7 +143,8 @@ class TerminateVnfs(threading.Thread):
         # delete vnf instance from aai
         resp_data, resp_status = delete_vnf_aai(self.vnf_inst_id, resource_version)
         if resp_data:
-            logger.debug("Fail to delete vnf instance[%s] from aai, resp_status: [%s]." % (self.vnf_inst_id, resp_status))
+            logger.debug("Fail to delete vnf instance[%s] from aai, resp_status: [%s]."
+                         % (self.vnf_inst_id, resp_status))
         else:
             logger.debug(
                 "Success to delete vnf instance[%s] from aai, resp_status: [%s]." % (self.vnf_inst_id, resp_status))
index bc3313c..ea37fab 100644 (file)
@@ -246,3 +246,99 @@ def delete_vserver_relationship(cloud_owner, cloud_region_id, tenant_id, vserver
         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
         raise NSLCMException("Delete vserver relationship exception in AAI")
     return json.JSONDecoder().decode(ret[1]), ret[2]
+
+
+def create_network_aai(network_id, data):
+    resource = "/network/l3-networks/l3-network/%s" % network_id
+    ret = call_aai(resource, "PUT", data)
+    if ret[0] != 0:
+        logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
+        raise NSLCMException("Network creation exception in AAI")
+    return json.JSONDecoder().decode(ret[1]), ret[2]
+
+
+def query_network_aai(network_id):
+    resource = "/network/l3-networks/l3-network/%s" % network_id
+    ret = call_aai(resource, "GET")
+    if ret[0] != 0:
+        logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
+        raise NSLCMException("Network query exception in AAI")
+    return json.JSONDecoder().decode(ret[1])
+
+
+def delete_network_aai(network_id, resource_version=""):
+    resource = "/network/l3-networks/l3-network/%s" % network_id
+    if resource_version:
+        resource = resource + "?resource-version=%s" % resource_version
+    ret = call_aai(resource, "DELETE")
+    if ret[0] != 0:
+        logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
+        raise NSLCMException("Network delete exception in AAI")
+    return json.JSONDecoder().decode(ret[1]), ret[2]
+
+
+def put_network_relationship(network_id, data):
+    resource = "/network/l3-networks/l3-network/%s/relationship-list/relationship" % network_id
+    ret = call_aai(resource, "PUT", data)
+    if ret[0] != 0:
+        logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
+        raise NSLCMException("Put or update network relationship exception in AAI")
+    return json.JSONDecoder().decode(ret[1]), ret[2]
+
+
+def delete_network_relationship(network_id):
+    resource = "/network/l3-networks/l3-network/%s/relationship-list/relationship" % network_id
+    ret = call_aai(resource, "DELETE")
+    if ret[0] != 0:
+        logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
+        raise NSLCMException("Delete network relationship exception in AAI")
+    return json.JSONDecoder().decode(ret[1]), ret[2]
+
+
+def create_subnet_aai(network_id, subnet_id, data):
+    resource = "/network/l3-networks/l3-network/%s/subnets/subnet/%s" % (network_id, subnet_id)
+    ret = call_aai(resource, "PUT", data)
+    if ret[0] != 0:
+        logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
+        raise NSLCMException("Subnetwork creation exception in AAI")
+    return json.JSONDecoder().decode(ret[1]), ret[2]
+
+
+def query_subnet_aai(network_id, subnet_id):
+    resource = "/network/l3-networks/l3-network/%s/subnets/subnet/%s" % (network_id, subnet_id)
+    ret = call_aai(resource, "GET")
+    if ret[0] != 0:
+        logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
+        raise NSLCMException("Subnetwork query exception in AAI")
+    return json.JSONDecoder().decode(ret[1])
+
+
+def delete_subnet_aai(network_id, subnet_id, resource_version=""):
+    resource = "/network/l3-networks/l3-network/%s/subnets/subnet/%s" % (network_id, subnet_id)
+    if resource_version:
+        resource = resource + "?resource-version=%s" % resource_version
+    ret = call_aai(resource, "DELETE")
+    if ret[0] != 0:
+        logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
+        raise NSLCMException("Subnetwork delete exception in AAI")
+    return json.JSONDecoder().decode(ret[1]), ret[2]
+
+
+def put_subnet_relationship(network_id, subnet_id, data):
+    resource = "/network/l3-networks/l3-network/%s/subnets/subnet/%s/relationship-list/relationship"\
+               % (network_id, subnet_id)
+    ret = call_aai(resource, "PUT", data)
+    if ret[0] != 0:
+        logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
+        raise NSLCMException("Put or update subnetwork relationship exception in AAI")
+    return json.JSONDecoder().decode(ret[1]), ret[2]
+
+
+def delete_subnet_relationship(network_id, subnet_id):
+    resource = "/network/l3-networks/l3-network/%s/subnets/subnet/%s/relationship-list/relationship"\
+               % (network_id, subnet_id)
+    ret = call_aai(resource, "DELETE")
+    if ret[0] != 0:
+        logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
+        raise NSLCMException("Delete subnetwork relationship exception in AAI")
+    return json.JSONDecoder().decode(ret[1]), ret[2]
diff --git a/pom.xml b/pom.xml
index ac70d49..2d0612d 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -18,7 +18,7 @@
     <parent>
         <groupId>org.onap.oparent</groupId>
         <artifactId>oparent</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
+        <version>0.1.1</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <groupId>org.onap.vfc.nfvo.lcm</groupId>
index 7f86aa1..5128787 100644 (file)
@@ -3,7 +3,7 @@
 # because they are used in Jenkins, whose plug-in doesn't support
 
 major=1
-minor=1
+minor=0
 patch=0
 
 base_version=${major}.${minor}.${patch}