diff options
author | 2018-09-06 12:48:42 +0530 | |
---|---|---|
committer | 2018-09-06 12:50:40 +0530 | |
commit | c78cda3f14d09c2d15ed1985be684a73f34282c1 (patch) | |
tree | d70a87344a305dfad5741b46fd157d2a647ada44 /lcm/lcm/pub/utils | |
parent | 8f59e8d4426a11ea3f2a16d0c0479786fd02a027 (diff) |
Add notification system util in GVNFM
Change-Id: I1489722e30121aebb69b524cdaafaa44729784a2
Signed-off-by: Bharath Thiruveedula<bharath.thiruveedula@verizon.com>
Issue-ID: VFC-1096
Diffstat (limited to 'lcm/lcm/pub/utils')
-rw-r--r-- | lcm/lcm/pub/utils/notificationsutil.py | 63 | ||||
-rw-r--r-- | lcm/lcm/pub/utils/tests.py | 79 |
2 files changed, 141 insertions, 1 deletions
diff --git a/lcm/lcm/pub/utils/notificationsutil.py b/lcm/lcm/pub/utils/notificationsutil.py new file mode 100644 index 00000000..3af8f22a --- /dev/null +++ b/lcm/lcm/pub/utils/notificationsutil.py @@ -0,0 +1,63 @@ +# Copyright (C) 2018 Verizon. All Rights Reserved +# +# 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. + +import json +import logging +import requests + +from rest_framework import status +from requests.auth import HTTPBasicAuth + +from lcm.nf import const +from lcm.pub.database.models import SubscriptionModel + +logger = logging.getLogger(__name__) + + +class NotificationsUtil(object): + def __init__(self): + pass + + def send_notification(self, notification): + logger.info("Send Notifications to the callbackUri") + filters = { + "vnfInstanceId": "vnf_instance_filter", + "operationState": "operation_states", + "operation": "operation_types" + } + subscriptions_filter = {v + "__contains": notification[k] for k, v in filters.iteritems()} + + subscriptions = SubscriptionModel.objects.filter(**subscriptions_filter) + if not subscriptions.exists(): + logger.info("No subscriptions created for the filters %s" % notification) + return + logger.info("Start sending notifications") + for subscription in subscriptions: + # set subscription id + notification["subscriptionId"] = subscription.subscription_id + callbackUri = subscription.callback_uri + auth_info = json.loads(subscription.auth_info) + if auth_info["authType"] == const.OAUTH2_CLIENT_CREDENTIALS: + pass + self.post_notification(callbackUri, auth_info, notification) + + def post_notification(self, callbackUri, auth_info, notification): + params = auth_info.get("paramsBasic", {}) + username = params.get("userName") + password = params.get("password") + logger.info("Sending notification to %s", callbackUri) + resp = requests.post(callbackUri, data=notification, auth=HTTPBasicAuth(username, password)) + if resp.status_code != status.HTTP_204_NO_CONTENT: + raise Exception("Unable to send the notification to %s, due to %s" % (callbackUri, resp.text)) + return diff --git a/lcm/lcm/pub/utils/tests.py b/lcm/lcm/pub/utils/tests.py index 87516f07..16210db6 100644 --- a/lcm/lcm/pub/utils/tests.py +++ b/lcm/lcm/pub/utils/tests.py @@ -16,14 +16,16 @@ import unittest import mock import enumutil import fileutil +import json import urllib2 import syscomm import timeutil import values import platform -from lcm.pub.database.models import JobStatusModel, JobModel +from lcm.pub.database.models import JobStatusModel, JobModel, SubscriptionModel from lcm.pub.utils.jobutil import JobUtil +from lcm.pub.utils.notificationsutil import NotificationsUtil class MockReq(): @@ -225,3 +227,78 @@ class UtilsTest(unittest.TestCase): self.assertEqual("def", values.ignore_case_get(data, 'abc')) self.assertEqual("klm", values.ignore_case_get(data, 'hig')) self.assertEqual("bbb", values.ignore_case_get(data, 'aaa', 'bbb')) + + +class TestNotificationUtils(unittest.TestCase): + def setUp(self): + subscription_id = 1 + auth_params = { + "authType": ["BASIC"], + "paramsBasic": { + "username": "username", + "password": "password" + } + } + notification_types = ["VnfLcmOperationOccurrenceNotification"] + operation_types = ["INSTANTIATE"] + operation_states = ["STARTING"] + vnf_instance_filter = { + 'vnfdIds': ['99442b18-a5c7-11e8-998c-bf1755941f13', '9fe4080c-b1a3-11e8-bb96-645106374fd3'], + 'vnfInstanceIds': ['99442b18-a5c7-11e8-998c-bf1755941f12'], + 'vnfInstanceNames': ['demo'], + 'vnfProductsFromProviders': { + 'vnfProvider': u'string', + 'vnfProducts': { + 'vnfProductName': 'string', + 'versions': { + 'vnfSoftwareVersion': u'string', + 'vnfdVersions': 'string' + } + } + } + } + links = { + "self": "demo" + } + SubscriptionModel(subscription_id=subscription_id, callback_uri="http://demo", + auth_info=json.dumps(auth_params), + notification_types=json.dumps(notification_types), + operation_types=json.dumps(operation_types), + operation_states=json.dumps(operation_states), + vnf_instance_filter=json.dumps(vnf_instance_filter), + links=json.dumps(links)).save() + + def tearDown(self): + SubscriptionModel.objects.all().delete() + + @mock.patch('requests.post') + def test_send_notification(self, mock_post): + dummy_notification = { + "vnfInstanceId": "99442b18-a5c7-11e8-998c-bf1755941f13", + "operationState": "STARTING", + "operation": "INSTANTIATE", + } + mock_post.return_value.status_code = 204 + NotificationsUtil().send_notification(dummy_notification) + mock_post.assert_called_once() + + @mock.patch('requests.post') + def test_send_notification_with_empty_filters(self, mock_post): + dummy_notification = { + "vnfInstanceId": "9fe4080c-b1a3-11e8-bb96-645106374fd3", + "operationState": "", + "operation": "", + } + mock_post.return_value.status_code = 204 + NotificationsUtil().send_notification(dummy_notification) + mock_post.assert_called_once() + + @mock.patch('requests.post') + def test_send_notification_unmatched_filters(self, mock_post): + dummy_notification = { + "vnfInstanceId": "9fe4080c-b1a3-11e8-bb96-xxxxx", + "operationState": "DUMMY", + "operation": "DUMMY", + } + NotificationsUtil().send_notification(dummy_notification) + mock_post.assert_not_called() |