mirror of
https://github.com/ansible/awx.git
synced 2026-03-11 22:49:32 -02:30
draft 1 of socket refactoring
This commit is contained in:
@@ -16,7 +16,9 @@ def ws_disconnect(message):
|
|||||||
|
|
||||||
@channel_session
|
@channel_session
|
||||||
def ws_receive(message):
|
def ws_receive(message):
|
||||||
|
print(message)
|
||||||
raw_data = message.content['text']
|
raw_data = message.content['text']
|
||||||
|
print(raw_data)
|
||||||
data = json.loads(raw_data)
|
data = json.loads(raw_data)
|
||||||
|
|
||||||
if 'groups' in data:
|
if 'groups' in data:
|
||||||
|
|||||||
@@ -716,6 +716,62 @@ var tower = angular.module('Tower', [
|
|||||||
function openSocket() {
|
function openSocket() {
|
||||||
$rootScope.socket = Socket({ scope: $rootScope});
|
$rootScope.socket = Socket({ scope: $rootScope});
|
||||||
$rootScope.socket.init();
|
$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();
|
openSocket();
|
||||||
|
|
||||||
@@ -737,27 +793,35 @@ var tower = angular.module('Tower', [
|
|||||||
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState) {
|
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState) {
|
||||||
if(toState.name === 'dashboard'){
|
if(toState.name === 'dashboard'){
|
||||||
$rootScope.socket.emit('{"groups":{"jobs": ["status_changed"]}}');
|
$rootScope.socket.emit('{"groups":{"jobs": ["status_changed"]}}');
|
||||||
|
console.log(toState.name);
|
||||||
}
|
}
|
||||||
else if(toState.name === 'jobDetail'){
|
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'){
|
else if(toState.name === 'jobStdout'){
|
||||||
$rootScope.socket.emit('{"groups":{"jobs": ["status_changed"]}}');
|
$rootScope.socket.emit('{"groups":{"jobs": ["status_changed"]}}');
|
||||||
|
console.log(toState.name);
|
||||||
}
|
}
|
||||||
else if(toState.name === 'jobs'){
|
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'){
|
else if(toState.name === 'portalMode'){
|
||||||
$rootScope.socket.emit('{"groups":{"jobs": ["status_changed"]}}');
|
$rootScope.socket.emit('{"groups":{"jobs": ["status_changed"]}}');
|
||||||
|
console.log(toState.name);
|
||||||
}
|
}
|
||||||
else if(toState.name === 'projects'){
|
else if(toState.name === 'projects'){
|
||||||
$rootScope.socket.emit('{"groups":{"jobs": ["status_changed"]}}');
|
$rootScope.socket.emit('{"groups":{"jobs": ["status_changed"]}}');
|
||||||
|
console.log(toState.name);
|
||||||
}
|
}
|
||||||
else if(toState.name === 'inventory'){
|
else if(toState.name === 'inventory'){
|
||||||
$rootScope.socket.emit('{"groups":{"jobs": ["status_changed"]}}');
|
$rootScope.socket.emit('{"groups":{"jobs": ["status_changed"]}}');
|
||||||
|
console.log(toState.name);
|
||||||
}
|
}
|
||||||
else if(toState.name === 'adHocJobStdout'){
|
else if(toState.name === 'adHocJobStdout'){
|
||||||
$rootScope.socket.emit(`{"groups":{"ad_hoc_command_events": [${toParams.id}]}}`);
|
$rootScope.socket.emit(`{"groups":{"ad_hoc_command_events": [${toParams.id}]}}`);
|
||||||
|
console.log(toState.name);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -198,7 +198,10 @@ export default
|
|||||||
"<p><i class=\"fa fa-circle unreachable-hosts-color\"></i> Unreachable</p>\n" +
|
"<p><i class=\"fa fa-circle unreachable-hosts-color\"></i> Unreachable</p>\n" +
|
||||||
"<p><i class=\"fa fa-circle failed-hosts-color\"></i> Failed</p>\n";
|
"<p><i class=\"fa fa-circle failed-hosts-color\"></i> Failed</p>\n";
|
||||||
function openSocket() {
|
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
|
// update elapsed time on each event received
|
||||||
scope.job_status.elapsed = GetElapsed({
|
scope.job_status.elapsed = GetElapsed({
|
||||||
start: scope.job.created,
|
start: scope.job.created,
|
||||||
|
|||||||
@@ -26,28 +26,15 @@ import ReconnectingWebSocket from 'reconnectingwebsocket'
|
|||||||
export default
|
export default
|
||||||
angular.module('SocketIO', ['Utilities'])
|
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) {
|
return function(params) {
|
||||||
var scope = params.scope,
|
var scope = params.scope,
|
||||||
host = window.location.host,
|
host = window.location.host,
|
||||||
endpoint = params.endpoint,
|
|
||||||
protocol = $location.protocol(),
|
|
||||||
config, socketPort,
|
|
||||||
url;
|
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 = "ws://" + host + "/websocket/";
|
||||||
// url = protocol + '://' + host + ':' + socketPort + '/socket.io/' + endpoint;
|
|
||||||
$log.debug('opening socket connection to: ' + url);
|
$log.debug('opening socket connection to: ' + url);
|
||||||
|
|
||||||
function getSocketTip(status) {
|
function getSocketTip(status) {
|
||||||
@@ -82,6 +69,75 @@ angular.module('SocketIO', ['Utilities'])
|
|||||||
timeoutInterval: 3000,
|
timeoutInterval: 3000,
|
||||||
maxReconnectAttempts: 10
|
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 {
|
else {
|
||||||
// encountered expired token, redirect to login page
|
// encountered expired token, redirect to login page
|
||||||
@@ -113,19 +169,19 @@ angular.module('SocketIO', ['Utilities'])
|
|||||||
var self = this;
|
var self = this;
|
||||||
if(self){
|
if(self){
|
||||||
if(self.socket){
|
if(self.socket){
|
||||||
self.socket.onmessage(eventName, function (e) {
|
// self.socket.onmessage(function (e) {
|
||||||
console.log('Received From Server: ' + e.data);
|
// var args = arguments;
|
||||||
var args = arguments;
|
// self.scope.$apply(function () {
|
||||||
self.scope.$apply(function () {
|
// callback.apply(self.socket, args);
|
||||||
callback.apply(self.socket, args);
|
// });
|
||||||
});
|
// });
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
emit: function (eventName, data, callback) {
|
emit: function (eventName, data, callback) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
// console.log(eventName)
|
||||||
self.socket.send(eventName, data, function () {
|
self.socket.send(eventName, data, function () {
|
||||||
var args = arguments;
|
var args = arguments;
|
||||||
self.scope.$apply(function () {
|
self.scope.$apply(function () {
|
||||||
|
|||||||
Reference in New Issue
Block a user