+ if not filters or filters[0] == 0 or check_filters(
+ filters, sub_data, uow.resource_pools, ocloud.ResourcePool,
+ ocloud.ResourcePool.resourcePoolId, data.id):
+ callback_smo(notifications, sub, data, resource_pool_dict)
+ continue
+
+ logger.info('Subscription {} filter hit, skip ResourcePool {}.'
+ .format(sub_data['subscriptionId'], data.id))
+
+
+def _notify_dms(uow, notifications, data):
+ with uow:
+ dms = uow.deployment_managers.get(data.id)
+ if dms is None:
+ logger.warning(
+ 'DeploymentManager {} does not exists.'.format(data.id))
+ return
+
+ dms_dict = dms.get_notification_dict()
+
+ subs = uow.subscriptions.list()
+ for sub in subs:
+ sub_data = sub.serialize()
+ logger.debug('Subscription: {}'.format(sub_data['subscriptionId']))
+ filters = handle_filter(
+ sub_data['filter'], 'DeploymentManagerInfo')
+ logger.debug(f'filters: {filters}, sub_data: {sub_data}')
+
+ if not filters or filters[0] == 0 or check_filters(
+ filters, sub_data, uow.deployment_managers,
+ ocloud.DeploymentManager,
+ ocloud.DeploymentManager.deploymentManagerId, data.id):
+ callback_smo(notifications, sub, data, dms_dict)
+ continue
+
+ logger.info('Subscription {} filter hit, skip '
+ 'DeploymentManager {}.'
+ .format(sub_data['subscriptionId'], data.id))
+
+
+def _notify_ocloud(uow, notifications, data):
+ with uow:
+ ocloud = uow.oclouds.get(data.id)
+ if ocloud is None:
+ logger.warning(
+ 'oCloud {} does not exists.'.format(data.id))
+ return
+
+ ocloud_dict = ocloud.get_notification_dict()
+
+ subs = uow.subscriptions.list()
+ for sub in subs:
+ sub_data = sub.serialize()
+ logger.debug('Subscription: {}'.format(sub_data['subscriptionId']))
+ filters = handle_filter(
+ sub_data['filter'], 'CloudInfo')
+ logger.debug(f'filters: {filters}, sub_data: {sub_data}')
+
+ if not filters or filters[0] == 0 or check_filters(
+ filters, sub_data, uow.oclouds,
+ ocloud.Ocloud,
+ ocloud.Ocloud.oCloudId, data.id):
+ callback_smo(notifications, sub, data, ocloud_dict)
+ continue
+
+ logger.info('Subscription {} filter hit, skip Cloud {}.'
+ .format(sub_data['subscriptionId'], data.id))
+
+
+def _notify_resource(uow, notifications, data):
+ with uow:
+ resource = uow.resources.get(data.id)
+ if resource is None:
+ logger.warning('Resource {} does not exists.'.format(data.id))
+ return
+ res_pool_id = resource.serialize()['resourcePoolId']
+ logger.debug('res pool id is {}'.format(res_pool_id))
+
+ res_dict = resource.get_notification_dict()
+
+ subs = uow.subscriptions.list()
+ for sub in subs:
+ sub_data = sub.serialize()
+ logger.debug('Subscription: {}'.format(sub_data['subscriptionId']))
+ filters = handle_filter(sub_data['filter'], 'ResourceInfo')
+ if not filters or filters[0] == 0:
+ callback_smo(notifications, sub, data, res_dict)
+ continue
+ if filters[0] > 0 and not filters[1]:
+ continue
+ filter_hit = False
+ for filter in filters[1]:
+ try:
+ args = gen_orm_filter(ocloud.Resource, filter)
+ except KeyError:
+ logger.warning(
+ 'Subscription {} filter {} has wrong attribute '
+ 'name or value. Ignore the filter.'.format(
+ sub_data['subscriptionId'],
+ sub_data['filter']))
+ continue
+ if len(args) == 0 and 'objectType' in filter:
+ filter_hit = True
+ break
+ args.append(ocloud.Resource.resourceId == data.id)
+ obj_count, _ = uow.resources.list_with_count(
+ res_pool_id, *args)
+ if obj_count > 0:
+ filter_hit = True
+ break
+ if filter_hit:
+ logger.info('Subscription {} filter hit, skip Resource {}.'
+ .format(sub_data['subscriptionId'], data.id))
+ else:
+ callback_smo(notifications, sub, data, res_dict)
+
+
+def callback_smo(notifications: AbstractNotifications, sub: Subscription,
+ msg: Message2SMO, obj_dict: dict = None):