mirror of
https://github.com/ansible/awx.git
synced 2026-03-23 03:45:01 -02:30
Import socketio service work and updates to documentation and setup procedures
This commit is contained in:
4
Makefile
4
Makefile
@@ -117,6 +117,7 @@ server:
|
|||||||
tmux rename-window 'Tower'
|
tmux rename-window 'Tower'
|
||||||
tmux select-window -t tower:0
|
tmux select-window -t tower:0
|
||||||
tmux split-window -v 'exec make celeryd'
|
tmux split-window -v 'exec make celeryd'
|
||||||
|
tmux split-window -h 'exec make socketservice'
|
||||||
tmux split-window -v 'exec make receiver'
|
tmux split-window -v 'exec make receiver'
|
||||||
tmux split-window -h 'exec make taskmanager'
|
tmux split-window -h 'exec make taskmanager'
|
||||||
tmux -2 attach-session -t tower
|
tmux -2 attach-session -t tower
|
||||||
@@ -136,6 +137,9 @@ receiver:
|
|||||||
taskmanager:
|
taskmanager:
|
||||||
$(PYTHON) manage.py run_task_system
|
$(PYTHON) manage.py run_task_system
|
||||||
|
|
||||||
|
socketservice:
|
||||||
|
$(PYTHON) manage.py run_socketio_service
|
||||||
|
|
||||||
# Run all API unit tests.
|
# Run all API unit tests.
|
||||||
test:
|
test:
|
||||||
$(PYTHON) manage.py test -v2 main
|
$(PYTHON) manage.py test -v2 main
|
||||||
|
|||||||
88
awx/main/management/commands/run_socketio_service.py
Normal file
88
awx/main/management/commands/run_socketio_service.py
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
# Copyright (c) 2014 AnsibleWorks, Inc.
|
||||||
|
# All Rights Reserved.
|
||||||
|
|
||||||
|
# Python
|
||||||
|
import os
|
||||||
|
import datetime
|
||||||
|
import logging
|
||||||
|
import json
|
||||||
|
import signal
|
||||||
|
import time
|
||||||
|
from optparse import make_option
|
||||||
|
from multiprocessing import Process
|
||||||
|
|
||||||
|
# Django
|
||||||
|
from django.conf import settings
|
||||||
|
from django.core.management.base import NoArgsCommand, CommandError
|
||||||
|
from django.db import transaction, DatabaseError
|
||||||
|
from django.contrib.auth.models import User
|
||||||
|
from django.utils.dateparse import parse_datetime
|
||||||
|
from django.utils.timezone import now, is_aware, make_aware
|
||||||
|
from django.utils.tzinfo import FixedOffset
|
||||||
|
|
||||||
|
# AWX
|
||||||
|
from awx.main.models import *
|
||||||
|
|
||||||
|
# ZeroMQ
|
||||||
|
import zmq
|
||||||
|
|
||||||
|
# gevent & socketio
|
||||||
|
from socketio import socketio_manage
|
||||||
|
from socketio.server import SocketIOServer
|
||||||
|
from socketio.namespace import BaseNamespace
|
||||||
|
|
||||||
|
class TestNamespace(BaseNamespace):
|
||||||
|
|
||||||
|
def recv_connect(self):
|
||||||
|
print("Received client connect for test namespace from %s" % str(self.environ['REMOTE_ADDR']))
|
||||||
|
#print("Env: " + str(self.environ))
|
||||||
|
self.emit('connect', True)
|
||||||
|
|
||||||
|
class TowerSocket(object):
|
||||||
|
|
||||||
|
def __call__(self, environ, start_response):
|
||||||
|
path = environ['PATH_INFO'].strip('/') or 'index.html'
|
||||||
|
print path
|
||||||
|
if path.startswith('socket.io'):
|
||||||
|
socketio_manage(environ, {'/socket.io/test': TestNamespace})
|
||||||
|
socketio_manage(environ, {'/socket.io/jobs': JobNamespace})
|
||||||
|
socketio_manage(environ, {'/socket.io/job_events': JobEventNamespace})
|
||||||
|
else:
|
||||||
|
start_response('404 Not Found', [])
|
||||||
|
return ['<h1>Not Found</h1>']
|
||||||
|
|
||||||
|
class Command(NoArgsCommand):
|
||||||
|
'''
|
||||||
|
SocketIO event emitter Tower service
|
||||||
|
Receives notifications from other services destined for UI notification
|
||||||
|
'''
|
||||||
|
|
||||||
|
help = 'Launch the SocketIO event emitter service'
|
||||||
|
|
||||||
|
option_list = NoArgsCommand.option_list + (
|
||||||
|
make_option('--receive_port', dest='receive_port', type='int', default=5559,
|
||||||
|
help='Port to listen for new events that will be destined for a client'),
|
||||||
|
make_option('--socketio_port', dest='socketio_port', type='int', default=8080,
|
||||||
|
help='Port to accept socketio requests from clients'),)
|
||||||
|
|
||||||
|
def init_logging(self):
|
||||||
|
log_levels = dict(enumerate([logging.ERROR, logging.INFO,
|
||||||
|
logging.DEBUG, 0]))
|
||||||
|
self.logger = logging.getLogger('awx.main.commands.run_socketio_service')
|
||||||
|
self.logger.setLevel(log_levels.get(self.verbosity, 0))
|
||||||
|
handler = logging.StreamHandler()
|
||||||
|
handler.setFormatter(logging.Formatter('%(message)s'))
|
||||||
|
self.logger.addHandler(handler)
|
||||||
|
self.logger.propagate = False
|
||||||
|
|
||||||
|
def handle_noargs(self, **options):
|
||||||
|
self.verbosity = int(options.get('verbosity', 1))
|
||||||
|
self.init_logging()
|
||||||
|
socketio_listen_port = settings.SOCKETIO_LISTEN_PORT
|
||||||
|
socketio_notification_port = settings.SOCKETIO_NOTIFICATION_PORT
|
||||||
|
try:
|
||||||
|
print 'Listening on port http://0.0.0.0:' + str(socketio_listen_port)
|
||||||
|
server = SocketIOServer(('0.0.0.0', socketio_listen_port), TowerSocket(), resource='socket.io')
|
||||||
|
server.serve_forever()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
||||||
@@ -104,7 +104,9 @@ class Schedule(CommonModel):
|
|||||||
self.dtend = make_aware(datetime.datetime.strptime(until_date, "%Y%m%dT%H%M%SZ"), get_default_timezone())
|
self.dtend = make_aware(datetime.datetime.strptime(until_date, "%Y%m%dT%H%M%SZ"), get_default_timezone())
|
||||||
if 'count' in self.rrule.lower():
|
if 'count' in self.rrule.lower():
|
||||||
self.dtend = future_rs[-1]
|
self.dtend = future_rs[-1]
|
||||||
self.unified_job_template.update_computed_fields()
|
from awx.main.signals import ignore_inventory_computed_fields
|
||||||
|
with ignore_inventory_computed_fields():
|
||||||
|
self.unified_job_template.update_computed_fields()
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
self.update_computed_fields()
|
self.update_computed_fields()
|
||||||
|
|||||||
@@ -387,6 +387,9 @@ CALLBACK_QUEUE_PORT = "ipc:///tmp/callback_receiver.ipc"
|
|||||||
|
|
||||||
TASK_COMMAND_PORT = "tcp://127.0.0.1:6556"
|
TASK_COMMAND_PORT = "tcp://127.0.0.1:6556"
|
||||||
|
|
||||||
|
SOCKETIO_NOTIFICATION_PORT = "tcp://127.0.0.1:6557"
|
||||||
|
SOCKETIO_LISTEN_PORT = 8080
|
||||||
|
|
||||||
# Logging configuration.
|
# Logging configuration.
|
||||||
LOGGING = {
|
LOGGING = {
|
||||||
'version': 1,
|
'version': 1,
|
||||||
|
|||||||
Reference in New Issue
Block a user