diff --git a/awx/main/consumers.py b/awx/main/consumers.py index 990e197cd2..67fe0e428d 100644 --- a/awx/main/consumers.py +++ b/awx/main/consumers.py @@ -16,7 +16,9 @@ def ws_disconnect(message): @channel_session def ws_receive(message): + print(message) raw_data = message.content['text'] + print(raw_data) data = json.loads(raw_data) if 'groups' in data: diff --git a/awx/ui/client/src/app.js b/awx/ui/client/src/app.js index 76506bf43e..5048c69572 100644 --- a/awx/ui/client/src/app.js +++ b/awx/ui/client/src/app.js @@ -716,6 +716,62 @@ var tower = angular.module('Tower', [ function openSocket() { $rootScope.socket = Socket({ scope: $rootScope}); $rootScope.socket.init(); + // $rootScope.socket.on("status_changed", function(data) { + // $log.debug('Job ' + data.unified_job_id + + // ' status changed to ' + data.status + + // ' send to ' + $location.$$url); + // + // // this acts as a router...it emits the proper + // // value based on what URL the user is currently + // // accessing. + // if ($state.is('jobs')) { + // $rootScope.$emit('JobStatusChange-jobs', data); + // } else if ($state.includes('jobDetail') || + // $state.is('adHocJobStdout') || + // $state.is('inventorySyncStdout') || + // $state.is('managementJobStdout') || + // $state.is('scmUpdateStdout')) { + // + // $log.debug("sending status to standard out"); + // $rootScope.$emit('JobStatusChange-jobStdout', data); + // } + // if ($state.includes('jobDetail')) { + // $rootScope.$emit('JobStatusChange-jobDetails', data); + // } else if ($state.is('dashboard')) { + // $rootScope.$emit('JobStatusChange-home', data); + // } else if ($state.is('portalMode')) { + // $rootScope.$emit('JobStatusChange-portal', data); + // } else if ($state.is('projects')) { + // $rootScope.$emit('JobStatusChange-projects', data); + // } else if ($state.is('inventoryManage')) { + // $rootScope.$emit('JobStatusChange-inventory', data); + // } + // }); + // $rootScope.socket.on("summary_complete", function(data) { + // $log.debug('Job summary_complete ' + data.unified_job_id); + // $rootScope.$emit('JobSummaryComplete', data); + // }); + + // schedule_socket = Socket({ + // scope: $rootScope, + // endpoint: "schedules" + // }); + // schedule_socket.init(); + // $rootScope.socket.on("schedule_changed", function(data) { + // $log.debug('Schedule ' + data.unified_job_id + ' status changed to ' + data.status); + // $rootScope.$emit('ScheduleStatusChange', data); + // }); + + // control_socket = Socket({ + // scope: $rootScope, + // endpoint: "control" + // }); + // control_socket.init(); + // $rootScope.socket.on("limit_reached", function(data) { + // $log.debug(data.reason); + // $rootScope.sessionTimer.expireSession('session_limit'); + // $state.go('signOut'); + // }); } openSocket(); @@ -737,27 +793,35 @@ var tower = angular.module('Tower', [ $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState) { if(toState.name === 'dashboard'){ $rootScope.socket.emit('{"groups":{"jobs": ["status_changed"]}}'); + console.log(toState.name); } else if(toState.name === 'jobDetail'){ - $rootScope.socket.emit(`{"groups":{"jobs": ["status_changed", "summary"]},{"job_events":[${toParams.id}]}}`); + $rootScope.socket.emit(`{"groups":{"jobs": ["status_changed", "summary"] , "job_events":[${toParams.id}]}}`); + console.log(toState.name); } else if(toState.name === 'jobStdout'){ $rootScope.socket.emit('{"groups":{"jobs": ["status_changed"]}}'); + console.log(toState.name); } else if(toState.name === 'jobs'){ - $rootScope.socket.emit('{"groups":{"jobs": ["status_changed"]}, {"schedules": ["changed"]}}'); + $rootScope.socket.emit('{"groups":{"jobs": ["status_changed"] , "schedules": ["changed"]}}'); + console.log(toState.name); } else if(toState.name === 'portalMode'){ $rootScope.socket.emit('{"groups":{"jobs": ["status_changed"]}}'); + console.log(toState.name); } else if(toState.name === 'projects'){ $rootScope.socket.emit('{"groups":{"jobs": ["status_changed"]}}'); + console.log(toState.name); } else if(toState.name === 'inventory'){ $rootScope.socket.emit('{"groups":{"jobs": ["status_changed"]}}'); + console.log(toState.name); } else if(toState.name === 'adHocJobStdout'){ $rootScope.socket.emit(`{"groups":{"ad_hoc_command_events": [${toParams.id}]}}`); + console.log(toState.name); } }); diff --git a/awx/ui/client/src/job-detail/job-detail.controller.js b/awx/ui/client/src/job-detail/job-detail.controller.js index d883464938..71940a22f9 100644 --- a/awx/ui/client/src/job-detail/job-detail.controller.js +++ b/awx/ui/client/src/job-detail/job-detail.controller.js @@ -198,7 +198,10 @@ export default "
Unreachable
\n" + "Failed
\n"; function openSocket() { - $rootScope.socket.on("job_events-" + job_id, function(data) { + if ($rootScope.removeJobEventChange) { + $rootScope.removeJobEventChange(); + } + $rootScope.removeJobEventChange = $rootScope.$on("job_events-" + job_id, function(e, data) { // update elapsed time on each event received scope.job_status.elapsed = GetElapsed({ start: scope.job.created, diff --git a/awx/ui/client/src/shared/Socket.js b/awx/ui/client/src/shared/Socket.js index 5bc01d6879..ddc0d74fdc 100644 --- a/awx/ui/client/src/shared/Socket.js +++ b/awx/ui/client/src/shared/Socket.js @@ -26,28 +26,15 @@ import ReconnectingWebSocket from 'reconnectingwebsocket' export default angular.module('SocketIO', ['Utilities']) - .factory('Socket', ['$rootScope', '$location', '$log', 'Authorization', 'Store', function ($rootScope, $location, $log, Authorization, Store) { + .factory('Socket', ['$rootScope', '$location', '$log', 'Authorization', + '$state', + function ($rootScope, $location, $log, Authorization, $state) { return function(params) { var scope = params.scope, host = window.location.host, - endpoint = params.endpoint, - protocol = $location.protocol(), - config, socketPort, url; - // Since some pages are opened in a new tab, we might get here before AnsibleConfig is available. - // In that case, load from local storage. - if ($AnsibleConfig) { - socketPort = $AnsibleConfig.websocket_port; - } - else { - $log.debug('getting web socket port from local storage'); - config = Store('AnsibleConfig'); - socketPort = config.websocket_port; - } - url = "ws://" + host + "/websocket/"; - // url = protocol + '://' + host + ':' + socketPort + '/socket.io/' + endpoint; $log.debug('opening socket connection to: ' + url); function getSocketTip(status) { @@ -82,6 +69,75 @@ angular.module('SocketIO', ['Utilities']) timeoutInterval: 3000, maxReconnectAttempts: 10 }); + self.socket.onopen = function () { + console.log('websocket connected'); //log errors + }; + + self.socket.onerror = function (error) { + console.log('Error Logged: ' + error); //log errors + }; + self.socket.onmessage = function (e) { + console.log('Received From Server: ' + e.data); + var data = JSON.parse(e.data); + // {'groups': + // {'jobs': ['status_changed', 'summary'], + // 'schedules': ['changed'], + // 'ad_hoc_command_events': [ids,], + // 'job_events': [ids,], + // 'control': ['limit_reached'], + // } + // } + if(data.group_name==="jobs"){ + + if (!('status' in data)){ + // we know that this must have been a + // summary complete message + $log.debug('Job summary_complete ' + data.unified_job_id); + $rootScope.$emit('JobSummaryComplete', data); + } + if ($state.is('jobs')) { + $rootScope.$emit('JobStatusChange-jobs', data); + } else if ($state.includes('jobDetail') || + $state.is('adHocJobStdout') || + $state.is('inventorySyncStdout') || + $state.is('managementJobStdout') || + $state.is('scmUpdateStdout')) { + + $log.debug("sending status to standard out"); + $rootScope.$emit('JobStatusChange-jobStdout', data); + } + if ($state.includes('jobDetail')) { + $rootScope.$emit('JobStatusChange-jobDetails', data); + } else if ($state.is('dashboard')) { + $rootScope.$emit('JobStatusChange-home', data); + } else if ($state.is('portalMode')) { + $rootScope.$emit('JobStatusChange-portal', data); + } else if ($state.is('projects')) { + $rootScope.$emit('JobStatusChange-projects', data); + } else if ($state.is('inventoryManage')) { + $rootScope.$emit('JobStatusChange-inventory', data); + } + } + if(data.group_name==="job_events"){ + $rootScope.$emit('job_events-'+data.job, data); + } + if(data.group_name==="schedules"){ + $log.debug('Schedule ' + data.unified_job_id + ' status changed to ' + data.status); + $rootScope.$emit('ScheduleStatusChange', data); + } + if(data.group_name==="ad_hoc_command_events"){ + + } + if(data.group_name==="control"){ + $log.debug(data.reason); + $rootScope.sessionTimer.expireSession('session_limit'); + $state.go('signOut'); + } + + + + }; + } else { // encountered expired token, redirect to login page @@ -113,19 +169,19 @@ angular.module('SocketIO', ['Utilities']) var self = this; if(self){ if(self.socket){ - self.socket.onmessage(eventName, function (e) { - console.log('Received From Server: ' + e.data); - var args = arguments; - self.scope.$apply(function () { - callback.apply(self.socket, args); - }); - }); + // self.socket.onmessage(function (e) { + // var args = arguments; + // self.scope.$apply(function () { + // callback.apply(self.socket, args); + // }); + // }); } } }, emit: function (eventName, data, callback) { var self = this; + // console.log(eventName) self.socket.send(eventName, data, function () { var args = arguments; self.scope.$apply(function () {