diff --git a/awx/main/signals.py b/awx/main/signals.py index bfb5b768cd..d0bad86619 100644 --- a/awx/main/signals.py +++ b/awx/main/signals.py @@ -43,44 +43,35 @@ def get_current_user_or_none(): return u -def emit_job_event_detail(sender, **kwargs): +def emit_event_detail(serializer, relation, **kwargs): instance = kwargs['instance'] created = kwargs['created'] if created: - event_serialized = JobEventWebSocketSerializer(instance).data - consumers.emit_channel_notification('job_events-' + str(instance.job.id), event_serialized) + event_serializer = serializer(instance) + consumers.emit_channel_notification( + '-'.join([event_serializer.get_group_name(instance), str(getattr(instance, relation))]), + event_serializer.data + ) + + +def emit_job_event_detail(sender, **kwargs): + emit_event_detail(JobEventWebSocketSerializer, 'job_id', **kwargs) def emit_ad_hoc_command_event_detail(sender, **kwargs): - instance = kwargs['instance'] - created = kwargs['created'] - if created: - event_serialized = AdHocCommandEventWebSocketSerializer(instance).data - consumers.emit_channel_notification('ad_hoc_command_events-' + str(instance.ad_hoc_command_id), event_serialized) + emit_event_detail(AdHocCommandEventWebSocketSerializer, 'ad_hoc_command_id', **kwargs) def emit_project_update_event_detail(sender, **kwargs): - instance = kwargs['instance'] - created = kwargs['created'] - if created: - event_serialized = ProjectUpdateEventWebSocketSerializer(instance).data - consumers.emit_channel_notification('project_update_events-' + str(instance.project_update_id), event_serialized) + emit_event_detail(ProjectUpdateEventWebSocketSerializer, 'project_update_id', **kwargs) def emit_inventory_update_event_detail(sender, **kwargs): - instance = kwargs['instance'] - created = kwargs['created'] - if created: - event_serialized = InventoryUpdateEventWebSocketSerializer(instance).data - consumers.emit_channel_notification('inventory_update_events-' + str(instance.inventory_update_id), event_serialized) + emit_event_detail(InventoryUpdateEventWebSocketSerializer, 'inventory_update_id', **kwargs) def emit_system_job_event_detail(sender, **kwargs): - instance = kwargs['instance'] - created = kwargs['created'] - if created: - event_serialized = SystemJobEventWebSocketSerializer(instance).data - consumers.emit_channel_notification('system_job_events-' + str(instance.system_job_id), event_serialized) + emit_event_detail(SystemJobEventWebSocketSerializer, 'system_job_id', **kwargs) def emit_update_inventory_computed_fields(sender, **kwargs): diff --git a/docs/websockets.md b/docs/websockets.md index 43c903f7b1..ef0bbaedbb 100644 --- a/docs/websockets.md +++ b/docs/websockets.md @@ -16,19 +16,22 @@ event group and event type which we later use in our wire protocol to control me You can connect to the Tower channels implementation using any standard websocket library but pointing it to `/websocket`. You must provide a valid Auth Token in the request URL. -Once you''ve connected you are not subscribed to any event groups. You subscribe by sending a json request that looks like the following: +Once you've connected, you are not subscribed to any event groups. You subscribe by sending a json request that looks like the following: 'groups': { 'jobs': ['status_changed', 'summary'], 'schedules': ['changed'], 'ad_hoc_command_events': [ids...], 'job_events': [ids...], - 'workflow_events': [ids...] + 'workflow_events': [ids...], + 'project_update_events': [ids...], + 'inventory_update_events': [ids...], + 'system_job_events': [ids...], 'control': ['limit_reached'], } These map to the event group and event type you are interested in. Sending in a new groups dictionary will clear all of your previously -subscribed groups before subscribing to the newly requested ones. This is intentional makes the single page navigation much easier since +subscribed groups before subscribing to the newly requested ones. This is intentional, and makes the single page navigation much easier since you only need to care about current subscriptions. ## Deployment