diff options
-rw-r--r-- | docs/APIs/VNFLCM_API/index.rst | 4 | ||||
-rw-r--r-- | docs/delivery.rst | 2 | ||||
-rw-r--r-- | docs/installation.rst | 2 | ||||
-rw-r--r-- | lcm/ns/ns_create.py | 17 | ||||
-rw-r--r-- | lcm/ns/ns_delete.py | 4 | ||||
-rw-r--r-- | lcm/ns/views.py | 5 | ||||
-rw-r--r-- | lcm/ns/vls/create_vls.py | 47 | ||||
-rw-r--r-- | lcm/ns/vls/delete_vls.py | 28 | ||||
-rw-r--r-- | lcm/ns/vnfs/create_vnfs.py | 2 | ||||
-rw-r--r-- | lcm/ns/vnfs/terminate_nfs.py | 4 | ||||
-rw-r--r-- | lcm/pub/msapi/aai.py | 96 | ||||
-rw-r--r-- | pom.xml | 2 | ||||
-rw-r--r-- | version.properties | 2 |
13 files changed, 183 insertions, 32 deletions
diff --git a/docs/APIs/VNFLCM_API/index.rst b/docs/APIs/VNFLCM_API/index.rst index 34c09905..1e679b15 100644 --- a/docs/APIs/VNFLCM_API/index.rst +++ b/docs/APIs/VNFLCM_API/index.rst @@ -1,7 +1,7 @@ VNF LCM API
----------
+------------
.. toctree::
:titlesonly:
- VNFLCM_API
\ No newline at end of file + VNFLCM_API
diff --git a/docs/delivery.rst b/docs/delivery.rst index f31d396e..9fa6fa81 100644 --- a/docs/delivery.rst +++ b/docs/delivery.rst @@ -1,5 +1,5 @@ VF-C Delivery --------- +------------- VF-C includs the following components in R1. |image0| diff --git a/docs/installation.rst b/docs/installation.rst index efdf8167..c1d2b396 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -2,7 +2,7 @@ .. http://creativecommons.org/licenses/by/4.0 VF-C Installation ------------- +----------------- Describe the environment and steps to install VF-C components. diff --git a/lcm/ns/ns_create.py b/lcm/ns/ns_create.py index e5435816..26d0a7d8 100644 --- a/lcm/ns/ns_create.py +++ b/lcm/ns/ns_create.py @@ -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 } ] diff --git a/lcm/ns/ns_delete.py b/lcm/ns/ns_delete.py index 52b0df84..dde89d1a 100644 --- a/lcm/ns/ns_delete.py +++ b/lcm/ns/ns_delete.py @@ -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)) diff --git a/lcm/ns/views.py b/lcm/ns/views.py index f7bb97a5..6d19263d 100644 --- a/lcm/ns/views.py +++ b/lcm/ns/views.py @@ -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) diff --git a/lcm/ns/vls/create_vls.py b/lcm/ns/vls/create_vls.py index 1d89c3d0..9d338388 100644 --- a/lcm/ns/vls/create_vls.py +++ b/lcm/ns/vls/create_vls.py @@ -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) diff --git a/lcm/ns/vls/delete_vls.py b/lcm/ns/vls/delete_vls.py index d2d8640d..4ed7bc8c 100644 --- a/lcm/ns/vls/delete_vls.py +++ b/lcm/ns/vls/delete_vls.py @@ -15,9 +15,11 @@ 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() diff --git a/lcm/ns/vnfs/create_vnfs.py b/lcm/ns/vnfs/create_vnfs.py index caaefc2d..f7b94911 100644 --- a/lcm/ns/vnfs/create_vnfs.py +++ b/lcm/ns/vnfs/create_vnfs.py @@ -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", diff --git a/lcm/ns/vnfs/terminate_nfs.py b/lcm/ns/vnfs/terminate_nfs.py index c88e844e..d641debc 100644 --- a/lcm/ns/vnfs/terminate_nfs.py +++ b/lcm/ns/vnfs/terminate_nfs.py @@ -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)) diff --git a/lcm/pub/msapi/aai.py b/lcm/pub/msapi/aai.py index bc3313c2..ea37fab5 100644 --- a/lcm/pub/msapi/aai.py +++ b/lcm/pub/msapi/aai.py @@ -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] @@ -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> diff --git a/version.properties b/version.properties index 7f86aa15..51287873 100644 --- a/version.properties +++ b/version.properties @@ -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} |