From: K Sai Kiran Date: Thu, 25 Jun 2020 09:15:50 +0000 (+0530) Subject: Feature 8840 Notify without auth and typo fixes X-Git-Tag: v8.0.0rc2~6 X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FNBI.git;a=commitdiff_plain;h=42c84ea6d88ecb94c2a7d2e3e94e86522cbd19aa;hp=8748af53c4e12a7034c9bc107c502c32c593aadf Feature 8840 Notify without auth and typo fixes Initial implementation always needed auth to make notification. After going through sol005, understanding is auth can be optional and while subscribing auth is kept optional. Also fixed some typos. Change-Id: I89c5cf8f0efa9915b4daebb0f8e0d20d2861f71c Signed-off-by: K Sai Kiran --- diff --git a/osm_nbi/notifications.py b/osm_nbi/notifications.py index eac9438..9156c2c 100644 --- a/osm_nbi/notifications.py +++ b/osm_nbi/notifications.py @@ -109,26 +109,34 @@ class NotificationBase: """ notifications = [] for subscriber in subscribers: + # Notify without auth + if not subscriber.get("authentication"): + notifications.append({ + "headers": self.payload_header, + "payload": self.get_payload(subscriber), + "CallbackUri": subscriber["CallbackUri"] + }) + elif subscriber["authentication"]["authType"] == "basic": + salt = subscriber["subscriptionId"] + hashed_password = subscriber["authentication"]["paramsBasic"]["password"] + password = self._decrypt_password(hashed_password, salt) + auth_basic = self._get_basic_auth(subscriber["authentication"]["paramsBasic"]["userName"], password) + notifications.append({ + "headers": self.payload_header, + "payload": self.get_payload(subscriber), + "auth_basic": auth_basic, + "CallbackUri": subscriber["CallbackUri"] + }) # TODO add support for AuthType OAuth and TLS after support is added in subscription. - if subscriber["authentication"]["authType"] != "basic": - self.logger.debug("Subscriber {} can not be notified {} notification auth type is not implemented" + else: + self.logger.debug("Subscriber {} can not be notified. {} notification auth type is not implemented" .format(subscriber["subscriptionId"], subscriber["authentication"]["authType"])) - continue - salt = subscriber["subscriptionId"] - hashed_password = subscriber["authentication"]["paramsBasic"]["password"] - password = self._decrypt_password(hashed_password, salt) - auth_basic = self._get_basic_auth(subscriber["authentication"]["paramsBasic"]["userName"], password) - notifications.append({ - "headers": self.payload_header, - "payload": self.get_payload(subscriber), - "auth_basic": auth_basic, - "CallbackUri": subscriber["CallbackUri"] - }) + tasks = [] async with aiohttp.ClientSession(loop=loop) as session: for notification in notifications: - tasks.append(asyncio.ensure_future(self.send_notification(session, notification), loop=loop)) + tasks.append(asyncio.ensure_future(self.send_notification(session, notification, loop=loop), loop=loop)) await asyncio.gather(*tasks, loop=loop) async def send_notification(self, session: aiohttp.ClientSession, notification: dict, @@ -146,7 +154,8 @@ class NotificationBase: while retry_count > 0: try: async with session.post(url=notification["CallbackUri"], headers=notification["headers"], - auth=notification["auth_basic"], data=json.dumps(notification["payload"]), + auth=notification.get("auth_basic", None), + data=json.dumps(notification["payload"]), timeout=timeout) as resp: # self.logger.debug("Notification response: {}".format(resp.status)) if resp.status == HTTPStatus.NO_CONTENT: @@ -159,7 +168,7 @@ class NotificationBase: return True except Exception as e: error_text = type(e).__name__ + ": " + str(e) - self.logger.debug("Unable while sending notification to subscriber {}. Details: {}" + self.logger.debug("Unable to send notification to subscriber {}. Details: {}" .format(notification["payload"]["subscriptionId"], error_text)) error_detail = { "error": type(e).__name__, @@ -206,7 +215,7 @@ class NsLcmNotification(NotificationBase): def __init__(self, db) -> None: """ - Constructor of NotificationBase class. + Constructor of NsLcmNotification class. :param db: Database handler. """ super().__init__(db)