aboutsummaryrefslogtreecommitdiffstats
path: root/catalog/packages/biz
diff options
context:
space:
mode:
authorhongyuzhao <zhao.hongyu@zte.com.cn>2019-12-05 16:32:27 +0800
committerhongyuzhao <zhao.hongyu@zte.com.cn>2019-12-05 17:09:31 +0800
commit2ae44b787c0795e60276c35aeb13e104ca17bfa7 (patch)
treebdcdd84ae7a96d78abfcd7cd18e3219259c0fb9a /catalog/packages/biz
parentf96008008bcbefd4142611c9ecca45899c5bb7d6 (diff)
Notify about NSD and PNFD changes
Change-Id: I49eb61990766f6e54c43702e0235a9aa633ad938 Issue-ID: MODELING-269 Signed-off-by: hongyu zhao <zhao.hongyu@zte.com.cn>
Diffstat (limited to 'catalog/packages/biz')
-rw-r--r--catalog/packages/biz/notificationsutil.py15
-rw-r--r--catalog/packages/biz/ns_descriptor.py41
-rw-r--r--catalog/packages/biz/pnf_descriptor.py28
-rw-r--r--catalog/packages/biz/vnf_package.py4
4 files changed, 68 insertions, 20 deletions
diff --git a/catalog/packages/biz/notificationsutil.py b/catalog/packages/biz/notificationsutil.py
index 04bad47..4fa8e79 100644
--- a/catalog/packages/biz/notificationsutil.py
+++ b/catalog/packages/biz/notificationsutil.py
@@ -23,6 +23,7 @@ import catalog.pub.utils.timeutil
from catalog.pub.utils.values import remove_none_key
from catalog.pub.config import config as pub_config
import traceback
+from django.db.models import Q
logger = logging.getLogger(__name__)
@@ -32,16 +33,20 @@ class NotificationsUtil(object):
pass
def send_notification(self, notification, filters, isvnfpkg):
- logger.info("Send Notifications to the callbackUri")
subscriptions_filter = {v + "__contains": notification[k] for k, v in filters.items()}
- logger.debug('send_notification subscriptions_filter = %s' % subscriptions_filter)
subscriptions_filter = remove_none_key(subscriptions_filter)
+ logger.debug('send_notification subscriptions_filter = %s' % subscriptions_filter)
+ q1 = Q()
+ q1.connector = 'OR'
+ for k, v in subscriptions_filter.items():
+ q1.children.append((k, v))
if isvnfpkg:
- subscriptions = VnfPkgSubscriptionModel.objects.filter(**subscriptions_filter)
+ subscriptions = VnfPkgSubscriptionModel.objects.filter(q1)
subscription_root_uri = const.VNFPKG_SUBSCRIPTION_ROOT_URI
else:
- subscriptions = NsdmSubscriptionModel.objects.filter(**subscriptions_filter)
+ subscriptions = NsdmSubscriptionModel.objects.filter(q1)
subscription_root_uri = const.NSDM_SUBSCRIPTION_ROOT_URI
+
if not subscriptions.exists():
logger.info("No subscriptions created for the filters %s" % notification)
return
@@ -82,7 +87,7 @@ class NotificationsUtil(object):
try:
resp = requests.post(callbackuri, data=notification, headers={'Connection': 'close'})
if resp.status_code != status.HTTP_204_NO_CONTENT:
- logger.error("Sendingnotification to %s failed: %s" % (callbackuri, resp.text))
+ logger.error("Sending notification to %s failed: %s" % (callbackuri, resp.text))
else:
logger.info("Sending notification to %s successfully.", callbackuri)
except:
diff --git a/catalog/packages/biz/ns_descriptor.py b/catalog/packages/biz/ns_descriptor.py
index f0e0572..ca1b684 100644
--- a/catalog/packages/biz/ns_descriptor.py
+++ b/catalog/packages/biz/ns_descriptor.py
@@ -19,12 +19,13 @@ import os
import uuid
from catalog.packages.biz.common import parse_file_range, read, save
-from catalog.packages.const import PKG_STATUS
from catalog.pub.config.config import CATALOG_ROOT_PATH
from catalog.pub.database.models import NSPackageModel, PnfPackageModel, VnfPackageModel
from catalog.pub.exceptions import CatalogException, ResourceNotFoundException
from catalog.pub.utils import fileutil, toscaparser
from catalog.pub.utils.values import ignore_case_get
+from catalog.packages.biz.notificationsutil import prepare_nsd_notification, NotificationsUtil
+from catalog.packages import const
logger = logging.getLogger(__name__)
@@ -41,9 +42,9 @@ class NsDescriptor(object):
user_defined_data = ignore_case_get(data, 'userDefinedData', {})
data = {
'id': id if id else str(uuid.uuid4()),
- 'nsdOnboardingState': PKG_STATUS.CREATED,
- 'nsdOperationalState': PKG_STATUS.DISABLED,
- 'nsdUsageState': PKG_STATUS.NOT_IN_USE,
+ 'nsdOnboardingState': const.PKG_STATUS.CREATED,
+ 'nsdOperationalState': const.PKG_STATUS.DISABLED,
+ 'nsdUsageState': const.PKG_STATUS.NOT_IN_USE,
'userDefinedData': user_defined_data,
'_links': None # TODO
}
@@ -92,6 +93,7 @@ class NsDescriptor(object):
ns_pkgs.delete()
ns_pkg_path = os.path.join(CATALOG_ROOT_PATH, nsd_info_id)
fileutil.delete_dirs(ns_pkg_path)
+ send_notification(const.NSD_NOTIFICATION_TYPE.NSD_DELETION, nsd_info_id)
logger.info('NSD(%s) has been deleted.' % nsd_info_id)
def upload(self, nsd_info_id, remote_file):
@@ -100,7 +102,7 @@ class NsDescriptor(object):
if not ns_pkgs.exists():
logger.error('NSD(%s) does not exist.' % nsd_info_id)
raise CatalogException('NSD(%s) does not exist.' % nsd_info_id)
- ns_pkgs.update(onboardingState=PKG_STATUS.UPLOADING)
+ ns_pkgs.update(onboardingState=const.PKG_STATUS.UPLOADING)
local_file_name = save(remote_file, nsd_info_id)
logger.info('NSD(%s) content has been uploaded.' % nsd_info_id)
@@ -112,7 +114,7 @@ class NsDescriptor(object):
if not ns_pkgs.exists():
logger.error('NSD(%s) does not exist.' % nsd_info_id)
raise ResourceNotFoundException('NSD(%s) does not exist.' % nsd_info_id)
- if ns_pkgs[0].onboardingState != PKG_STATUS.ONBOARDED:
+ if ns_pkgs[0].onboardingState != const.PKG_STATUS.ONBOARDED:
logger.error('NSD(%s) is not ONBOARDED.' % nsd_info_id)
raise CatalogException('NSD(%s) is not ONBOARDED.' % nsd_info_id)
@@ -124,7 +126,7 @@ class NsDescriptor(object):
def parse_nsd_and_save(self, nsd_info_id, local_file_name):
logger.info('Start to process NSD(%s)...' % nsd_info_id)
ns_pkgs = NSPackageModel.objects.filter(nsPackageId=nsd_info_id)
- ns_pkgs.update(onboardingState=PKG_STATUS.PROCESSING)
+ ns_pkgs.update(onboardingState=const.PKG_STATUS.PROCESSING)
nsd_json = toscaparser.parse_nsd(local_file_name)
logger.debug("%s", nsd_json)
@@ -140,6 +142,7 @@ class NsDescriptor(object):
other_nspkg = NSPackageModel.objects.filter(nsdId=nsd_id)
if other_nspkg and other_nspkg[0].nsPackageId != nsd_info_id:
logger.warn("NSD(%s,%s) already exists.", nsd_id, other_nspkg[0].nsPackageId)
+ send_notification(const.NSD_NOTIFICATION_TYPE.NSD_ONBOARDING_FAILURE, nsd_info_id, nsd_id)
raise CatalogException("NSD(%s) already exists." % nsd_id)
for vnf in nsd["vnfs"]:
@@ -173,14 +176,15 @@ class NsDescriptor(object):
nsdDescription=nsd.get("description", ""),
nsdVersion=nsd_version,
invariantId=invariant_id,
- onboardingState=PKG_STATUS.ONBOARDED,
- operationalState=PKG_STATUS.ENABLED,
- usageState=PKG_STATUS.NOT_IN_USE,
+ onboardingState=const.PKG_STATUS.ONBOARDED,
+ operationalState=const.PKG_STATUS.ENABLED,
+ usageState=const.PKG_STATUS.NOT_IN_USE,
nsPackageUri=local_file_name,
sdcCsarId=nsd_info_id,
localFilePath=local_file_name,
nsdModel=nsd_json
)
+ send_notification(const.NSD_NOTIFICATION_TYPE.NSD_ONBOARDING, nsd_info_id, nsd_id)
logger.info('NSD(%s) has been processed.' % nsd_info_id)
def fill_resp_data(self, ns_pkg):
@@ -236,4 +240,19 @@ class NsDescriptor(object):
def handle_upload_failed(self, nsd_info_id):
ns_pkg = NSPackageModel.objects.filter(nsPackageId=nsd_info_id)
- ns_pkg.update(onboardingState=PKG_STATUS.CREATED)
+ ns_pkg.update(onboardingState=const.PKG_STATUS.CREATED)
+
+
+def send_notification(type, nsd_info_id, nsd_id=None, failure_details=None, operational_state=None):
+ data = prepare_nsd_notification(nsd_info_id=nsd_info_id,
+ nsd_id=nsd_id,
+ notification_type=type,
+ failure_details=failure_details,
+ operational_state=operational_state)
+ filters = {
+ 'nsdInfoId': 'nsdInfoId',
+ 'nsdId': 'nsdId',
+ }
+ logger.debug('Notify request data = %s' % data)
+ logger.debug('Notify request filters = %s' % filters)
+ NotificationsUtil().send_notification(data, filters, False)
diff --git a/catalog/packages/biz/pnf_descriptor.py b/catalog/packages/biz/pnf_descriptor.py
index 547c198..6f45729 100644
--- a/catalog/packages/biz/pnf_descriptor.py
+++ b/catalog/packages/biz/pnf_descriptor.py
@@ -25,6 +25,8 @@ from catalog.pub.database.models import NSPackageModel, PnfPackageModel
from catalog.pub.exceptions import CatalogException, ResourceNotFoundException
from catalog.pub.utils import fileutil, toscaparser
from catalog.pub.utils.values import ignore_case_get
+from catalog.packages.biz.notificationsutil import prepare_pnfd_notification, NotificationsUtil
+from catalog.packages import const
logger = logging.getLogger(__name__)
@@ -76,8 +78,14 @@ class PnfDescriptor(object):
logger.info('Start to upload PNFD(%s)...' % pnfd_info_id)
pnf_pkgs = PnfPackageModel.objects.filter(pnfPackageId=pnfd_info_id)
if not pnf_pkgs.exists():
- logger.info('PNFD(%s) does not exist.' % pnfd_info_id)
- raise CatalogException('PNFD (%s) does not exist.' % pnfd_info_id)
+ details = 'PNFD(%s) is not CREATED.' % pnfd_info_id
+ logger.info(details)
+ send_notification(
+ type=const.NSD_NOTIFICATION_TYPE.PNFD_ONBOARDING_FAILURE,
+ pnfd_info_id=pnfd_info_id,
+ failure_details=details
+ )
+ raise CatalogException(details)
pnf_pkgs.update(onboardingState=PKG_STATUS.UPLOADING)
local_file_name = save(remote_file, pnfd_info_id)
@@ -110,6 +118,7 @@ class PnfDescriptor(object):
pnf_pkgs.delete()
pnf_pkg_path = os.path.join(CATALOG_ROOT_PATH, pnfd_info_id)
fileutil.delete_dirs(pnf_pkg_path)
+ send_notification(const.NSD_NOTIFICATION_TYPE.PNFD_DELETION, pnfd_info_id, del_pnfd_id)
logger.debug('PNFD(%s) has been deleted.' % pnfd_info_id)
def download(self, pnfd_info_id):
@@ -185,6 +194,7 @@ class PnfDescriptor(object):
localFilePath=local_file_name,
pnfdModel=pnfd_json
)
+ send_notification(const.NSD_NOTIFICATION_TYPE.PNFD_ONBOARDING, pnfd_info_id, pnfd_id)
logger.info('PNFD(%s) has been processed.' % pnfd_info_id)
def fill_response_data(self, pnf_pkg):
@@ -224,3 +234,17 @@ class PnfDescriptor(object):
logger.error(e.args[0])
return [1, e.args[0]]
return [0, ret]
+
+
+def send_notification(type, pnfd_info_id, pnfd_id=None, failure_details=None):
+ data = prepare_pnfd_notification(pnfd_info_id=pnfd_info_id,
+ pnfd_id=pnfd_id,
+ notification_type=type,
+ failure_details=failure_details)
+ filters = {
+ 'pnfdId': 'pnfdId',
+ 'pnfdInfoIds': 'pnfdInfoIds',
+ }
+ logger.debug('Notify request data = %s' % data)
+ logger.debug('Notify request filters = %s' % filters)
+ NotificationsUtil().send_notification(data, filters, False)
diff --git a/catalog/packages/biz/vnf_package.py b/catalog/packages/biz/vnf_package.py
index c68de63..be73595 100644
--- a/catalog/packages/biz/vnf_package.py
+++ b/catalog/packages/biz/vnf_package.py
@@ -111,8 +111,6 @@ class VnfPackage(object):
# logger.error("VNF package(%s) is not CREATED" % vnf_pkg_id)
# raise CatalogException("VNF package(%s) is not CREATED" % vnf_pkg_id)
vnf_pkg.update(onboardingState=const.PKG_STATUS.UPLOADING)
- send_notification(vnf_pkg_id, const.PKG_NOTIFICATION_TYPE.ONBOARDING,
- const.PKG_CHANGE_TYPE.OP_STATE_CHANGE)
local_file_name = save(remote_file, vnf_pkg_id)
logger.info('VNF package(%s) has been uploaded.' % vnf_pkg_id)
@@ -282,6 +280,8 @@ def parse_vnfd_and_save(vnf_pkg_id, vnf_pkg_path):
localFilePath=vnf_pkg_path,
vnfPackageUri=os.path.split(vnf_pkg_path)[-1]
)
+ send_notification(vnf_pkg_id, const.PKG_NOTIFICATION_TYPE.ONBOARDING,
+ const.PKG_CHANGE_TYPE.OP_STATE_CHANGE)
else:
raise CatalogException("VNF propeties and metadata in VNF Package(id=%s) are empty." % vnf_pkg_id)
logger.info('VNF package(%s) has been processed(done).' % vnf_pkg_id)