Fix inventory subscription filter with 'neq'; fix CloudInfo notification
[pti/o2.git] / o2ims / service / command / notify_handler.py
index 01c91c5..34470f3 100644 (file)
@@ -78,7 +78,7 @@ def _notify_resourcetype(uow, data):
             if not filters:
                 callback_smo(sub, data, resource_type_dict)
                 continue
-            filter_effect = 0
+            filter_hit = False
             for filter in filters:
                 try:
                     args = gen_orm_filter(ocloud.ResourceType, filter)
@@ -89,20 +89,19 @@ def _notify_resourcetype(uow, data):
                             sub_data['subscriptionId'],
                             sub_data['filter']))
                     continue
-                if len(args) == 0:
-                    continue
+                if len(args) == 0 and 'objectType' in filter:
+                    filter_hit = True
+                    break
                 args.append(ocloud.ResourceType.resourceTypeId == data.id)
-                ret = uow.resource_types.list_with_count(*args)
-                if ret[0] > 0:
-                    logger.debug(
-                        'ResourcePool {} skip for subscription {} because of'
-                        ' the filter.'
-                        .format(data.id, sub_data['subscriptionId']))
-                    filter_effect += 1
+                obj_count, _ = uow.resource_types.list_with_count(*args)
+                if obj_count > 0:
+                    filter_hit = True
                     break
-            if filter_effect > 0:
-                continue
-            callback_smo(sub, data, resource_type_dict)
+            if filter_hit:
+                logger.info('Subscription {} filter hit, skip ResourceType {}.'
+                            .format(sub_data['subscriptionId'], data.id))
+            else:
+                callback_smo(sub, data, resource_type_dict)
 
 
 def _notify_resourcepool(uow, data):
@@ -127,7 +126,7 @@ def _notify_resourcepool(uow, data):
             if not filters:
                 callback_smo(sub, data, resource_pool_dict)
                 continue
-            filter_effect = 0
+            filter_hit = False
             for filter in filters:
                 try:
                     args = gen_orm_filter(ocloud.ResourcePool, filter)
@@ -138,20 +137,19 @@ def _notify_resourcepool(uow, data):
                             sub_data['subscriptionId'],
                             sub_data['filter']))
                     continue
-                if len(args) == 0:
-                    continue
+                if len(args) == 0 and 'objectType' in filter:
+                    filter_hit = True
+                    break
                 args.append(ocloud.ResourcePool.resourcePoolId == data.id)
-                ret = uow.resource_pools.list_with_count(*args)
-                if ret[0] > 0:
-                    logger.debug(
-                        'ResourcePool {} skip for subscription {} because of'
-                        ' the filter.'
-                        .format(data.id, sub_data['subscriptionId']))
-                    filter_effect += 1
+                obj_count, _ = uow.resource_pools.list_with_count(*args)
+                if obj_count > 0:
+                    filter_hit = True
                     break
-            if filter_effect > 0:
-                continue
-            callback_smo(sub, data, resource_pool_dict)
+            if filter_hit:
+                logger.info('Subscription {} filter hit, skip ResourcePool {}.'
+                            .format(sub_data['subscriptionId'], data.id))
+            else:
+                callback_smo(sub, data, resource_pool_dict)
 
 
 def _notify_dms(uow, data):
@@ -178,7 +176,7 @@ def _notify_dms(uow, data):
             if not filters:
                 callback_smo(sub, data, dms_dict)
                 continue
-            filter_effect = 0
+            filter_hit = False
             for filter in filters:
                 try:
                     args = gen_orm_filter(ocloud.DeploymentManager, filter)
@@ -189,21 +187,21 @@ def _notify_dms(uow, data):
                             sub_data['subscriptionId'],
                             sub_data['filter']))
                     continue
-                if len(args) == 0:
-                    continue
+                if len(args) == 0 and 'objectType' in filter:
+                    filter_hit = True
+                    break
                 args.append(
                     ocloud.DeploymentManager.deploymentManagerId == data.id)
-                ret = uow.deployment_managers.list_with_count(*args)
-                if ret[0] > 0:
-                    logger.debug(
-                        'DeploymentManager {} skip for subscription {} because'
-                        ' of the filter.'
-                        .format(data.id, sub_data['subscriptionId']))
-                    filter_effect += 1
+                obj_count, _ = uow.deployment_managers.list_with_count(*args)
+                if obj_count > 0:
+                    filter_hit = True
                     break
-            if filter_effect > 0:
-                continue
-            callback_smo(sub, data, dms_dict)
+            if filter_hit:
+                logger.info('Subscription {} filter hit, skip '
+                            'DeploymentManager {}.'
+                            .format(sub_data['subscriptionId'], data.id))
+            else:
+                callback_smo(sub, data, dms_dict)
 
 
 def _notify_resource(uow, data):
@@ -230,7 +228,7 @@ def _notify_resource(uow, data):
             if not filters:
                 callback_smo(sub, data, res_dict)
                 continue
-            filter_effect = 0
+            filter_hit = False
             for filter in filters:
                 try:
                     args = gen_orm_filter(ocloud.Resource, filter)
@@ -241,20 +239,20 @@ def _notify_resource(uow, data):
                             sub_data['subscriptionId'],
                             sub_data['filter']))
                     continue
-                if len(args) == 0:
-                    continue
+                if len(args) == 0 and 'objectType' in filter:
+                    filter_hit = True
+                    break
                 args.append(ocloud.Resource.resourceId == data.id)
-                ret = uow.resources.list_with_count(res_pool_id, *args)
-                if ret[0] > 0:
-                    logger.debug(
-                        'Resource {} skip for subscription {} because of '
-                        'the filter.'
-                        .format(data.id, sub_data['subscriptionId']))
-                    filter_effect += 1
+                obj_count, _ = uow.resources.list_with_count(
+                    res_pool_id, *args)
+                if obj_count > 0:
+                    filter_hit = True
                     break
-            if filter_effect > 0:
-                continue
-            callback_smo(sub, data, res_dict)
+            if filter_hit:
+                logger.info('Subscription {} filter hit, skip Resource {}.'
+                            .format(sub_data['subscriptionId'], data.id))
+            else:
+                callback_smo(sub, data, res_dict)
 
 
 def handle_filter(filter: str, f_type: str):
@@ -294,15 +292,15 @@ def callback_smo(sub: Subscription, msg: Message2SMO, obj_dict: dict = None):
     }
     if msg.notificationEventType in [NotificationEventEnum.DELETE,
                                      NotificationEventEnum.MODIFY]:
-        callback['priorObjectState'] = obj_dict
+        callback['priorObjectState'] = json.dumps(obj_dict)
     if msg.notificationEventType in [NotificationEventEnum.CREATE,
                                      NotificationEventEnum.MODIFY]:
-        callback['postObjectState'] = obj_dict
+        callback['postObjectState'] = json.dumps(obj_dict)
     if msg.notificationEventType == NotificationEventEnum.DELETE:
         callback.pop('objectRef')
     callback_data = json.dumps(callback)
-    logger.info('URL: {}, data: {}'.format(
-        sub_data['callback'], callback_data))
+    logger.info('callback URL: {}'.format(sub_data['callback']))
+    logger.debug('callback data: {}'.format(callback_data))
 
     # Call SMO through the SMO callback url
     o = urlparse(sub_data['callback'])