VNF LCM API\r
----------\r
+------------\r
\r
.. toctree::\r
:titlesonly:\r
\r
- VNFLCM_API
\ No newline at end of file
+ VNFLCM_API\r
VF-C Delivery
---------
+-------------
VF-C includs the following components in R1.
|image0|
.. http://creativecommons.org/licenses/by/4.0
VF-C Installation
-------------
+-----------------
Describe the environment and steps to install VF-C components.
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 = ''
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()
"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
}
]
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))
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)
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
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)
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,
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)
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__)
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:
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)
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()
},
{
"relationship-key": "service-subscription.service-type",
- "relationship-value": "service-type-" + self.ns_inst_id
+ "relationship-value": "Network"
},
{
"relationship-key": "service-instance.service-instance-id",
# 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
# 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))
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]
<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>
# 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}