diff --git a/awx/network_ui/consumers.py b/awx/network_ui/consumers.py index 5f293dc500..e15689f865 100644 --- a/awx/network_ui/consumers.py +++ b/awx/network_ui/consumers.py @@ -23,6 +23,7 @@ from awx.network_ui.utils import transform_dict import dpath.util from pprint import pformat +import os import json import time # Connected to websocket.connect @@ -40,7 +41,6 @@ HISTORY_MESSAGE_IGNORE_TYPES = ['DeviceSelected', SPACING = 200 RACK_SPACING = 50 -settings.RECORDING = False logger = logging.getLogger("awx.network_ui.consumers") @@ -430,15 +430,6 @@ class _Persistence(object): else: logger.warning("Unsupported message %s", message['msg_type']) - def onDeploy(self, message_value, topology_id, client_id): - DeviceGroup("workers").send({"text": json.dumps(["Deploy", topology_id, yaml_serialize_topology(topology_id)])}) - - def onDestroy(self, message_value, topology_id, client_id): - DeviceGroup("workers").send({"text": json.dumps(["Destroy", topology_id])}) - - def onDiscover(self, message_value, topology_id, client_id): - DeviceGroup("workers").send({"text": json.dumps(["Discover", topology_id, yaml_serialize_topology(topology_id)])}) - def onLayout(self, message_value, topology_id, client_id): # circular_layout(topology_id) # grid_layout(topology_id) @@ -448,18 +439,18 @@ class _Persistence(object): pass def onCoverage(self, coverage, topology_id, client_id): - with open("coverage/coverage{0}.json".format(int(time.time())), "w") as f: + with open(os.path.abspath("coverage/coverage{0}.json".format(int(time.time()))), "w") as f: f.write(json.dumps(coverage['coverage'])) def onStartRecording(self, recording, topology_id, client_id): - settings.RECORDING = True + pass def onStopRecording(self, recording, topology_id, client_id): - settings.RECORDING = False + pass def write_event(self, event, topology_id, client_id): - if settings.RECORDING and event.get('save', True): - with open("recording.log", "a") as f: + if event.get('save', True): + with open(os.path.abspath("recording/recording_{0}.log".format(topology_id)), "a") as f: f.write(json.dumps(event)) f.write("\n") @@ -896,25 +887,6 @@ def ws_disconnect(message): def console_printer(message): print message['text'] # pragma: no cover -# Worker channel events - - -@channel_session -def worker_connect(message): - Group("workers").add(message.reply_channel) - - -@channel_session -def worker_message(message): - # Channel('console_printer').send({"text": message['text']}) - pass - - -@channel_session -def worker_disconnect(message): - pass - - # Tester channel events @channel_session diff --git a/awx/network_ui/management/commands/replay_recording.py b/awx/network_ui/management/commands/replay_recording.py index f30de96c1a..459faa2711 100644 --- a/awx/network_ui/management/commands/replay_recording.py +++ b/awx/network_ui/management/commands/replay_recording.py @@ -16,22 +16,22 @@ class Command(BaseCommand): parser.add_argument('topology_id', type=int) parser.add_argument('recording') parser.add_argument('--time-scale', dest="time_scale", default=1.0, type=float) - parser.add_argument('--delete-topology-at-start', dest="delete_topolgy", action="store_true", default=False) + parser.add_argument('--delete-topology-at-start', dest="delete_topology", action="store_true", default=False) def handle(self, *args, **options): print options['topology_id'] print options['recording'] topology_id = options['topology_id'] - if options['delete_topolgy'] is True: + if options['delete_topology'] is True: TopologyHistory.objects.filter(topology_id=topology_id).delete() Device.objects.filter(topology_id=topology_id).delete() time.scale = options.get('time_scale', 1.0) - ui = MessageHandler(create_connection("ws://localhost:8001/network_ui/topology?topology_id={0}".format(options['topology_id']))) + ui = MessageHandler(create_connection("ws://localhost:8013/network_ui/topology?topology_id={0}".format(options['topology_id']))) ui.recv() ui.recv() ui.send('StopRecording') ui.send('StartReplay') - if options['delete_topolgy'] is True: + if options['delete_topology'] is True: ui.send_message(['History', []]) ui.send('Snapshot', sender=ui.client_id, devices=[], links=[]) messages = [] diff --git a/awx/network_ui/management/commands/ui_test.py b/awx/network_ui/management/commands/ui_test.py index 64387e7476..42a902e283 100644 --- a/awx/network_ui/management/commands/ui_test.py +++ b/awx/network_ui/management/commands/ui_test.py @@ -39,7 +39,7 @@ class Command(BaseCommand): TestRedoPersistence, TestPersistence, TestViews, - TestWorkerWebSocket, + #TestWorkerWebSocket, TestAnsibleWebSocket, TestInvalidValues] if options.get('suites'): @@ -49,7 +49,7 @@ class Command(BaseCommand): verbosity=0 if options.get('quiet') else 2 if options.get('verbose') else 1, buffer=options.get('buffer')).run(unittest.TestSuite(tests)) - ui = MessageHandler(create_connection("ws://localhost:8001/network_ui/topology?topology_id=143")) + ui = MessageHandler(create_connection("ws://localhost:8013/network_ui/topology?topology_id=143")) ui.recv() ui.recv() ui.send('CoverageRequest') @@ -59,7 +59,7 @@ class Command(BaseCommand): class TestViews(unittest.TestCase): def test_index(self): - requests.get("http://localhost:8001/network_ui") + requests.get("http://localhost:8013/network_ui") class MessageHandler(object): @@ -104,28 +104,10 @@ class MessageHandler(object): self.ws.close() -class TestWorkerWebSocket(unittest.TestCase): - - def test(self): - self.worker = MessageHandler(create_connection("ws://localhost:8001/network_ui/worker?topology_id=143")) - self.ui = MessageHandler(create_connection("ws://localhost:8001/network_ui/tester?topology_id=143")) - self.ui.recv() - self.ui.recv() - self.ui.send("Deploy") - self.assertTrue(self.worker.recv()) - self.ui.send("Destroy") - self.assertTrue(self.worker.recv()) - self.worker.send("Hi") - - def tearDown(self): - self.worker.close() - self.ui.close() - - class TestAnsibleWebSocket(unittest.TestCase): def test(self): - self.ws = MessageHandler(create_connection("ws://localhost:8001/network_ui/ansible?topology_id=143")) + self.ws = MessageHandler(create_connection("ws://localhost:8013/network_ui/ansible?topology_id=143")) self.ws.send('Facts', foo=5) def tearDown(self): @@ -135,7 +117,7 @@ class TestAnsibleWebSocket(unittest.TestCase): class TestPersistence(unittest.TestCase): def setUp(self): - self.ws = MessageHandler(create_connection("ws://localhost:8001/network_ui/tester?topology_id=143")) + self.ws = MessageHandler(create_connection("ws://localhost:8013/network_ui/tester?topology_id=143")) self.ws.recv() self.ws.recv() @@ -213,7 +195,7 @@ class TestPersistence(unittest.TestCase): class TestUndoPersistence(unittest.TestCase): def setUp(self): - self.ws = MessageHandler(create_connection("ws://localhost:8001/network_ui/tester?topology_id=143")) + self.ws = MessageHandler(create_connection("ws://localhost:8013/network_ui/tester?topology_id=143")) self.ws.recv() self.ws.recv() @@ -305,7 +287,7 @@ class TestUndoPersistence(unittest.TestCase): class TestRedoPersistence(unittest.TestCase): def setUp(self): - self.ws = MessageHandler(create_connection("ws://localhost:8001/network_ui/tester?topology_id=143")) + self.ws = MessageHandler(create_connection("ws://localhost:8013/network_ui/tester?topology_id=143")) self.ws.recv() self.ws.recv() @@ -332,7 +314,7 @@ class TestRedoPersistence(unittest.TestCase): class TestUIWebSocket(unittest.TestCase): def test(self): - self.ui = MessageHandler(create_connection("ws://localhost:8001/network_ui/topology?topology_id=143")) + self.ui = MessageHandler(create_connection("ws://localhost:8013/network_ui/topology?topology_id=143")) self.ui.recv() self.ui.recv() self.ui.send("Hello") @@ -344,8 +326,8 @@ class TestUIWebSocket(unittest.TestCase): class TestUI(unittest.TestCase): def setUp(self): - self.ws = MessageHandler(create_connection("ws://localhost:8001/network_ui/tester?topology_id=143")) - self.ui = MessageHandler(create_connection("ws://localhost:8001/network_ui/topology?topology_id=143")) + self.ws = MessageHandler(create_connection("ws://localhost:8013/network_ui/tester?topology_id=143")) + self.ui = MessageHandler(create_connection("ws://localhost:8013/network_ui/topology?topology_id=143")) self.ws.recv() self.ws.recv() self.ui.recv() @@ -515,22 +497,22 @@ topology_id: 143 class TestInvalidValues(unittest.TestCase): def test_bad_topology_id1(self): - self.ws = MessageHandler(create_connection("ws://localhost:8001/network_ui/tester?topology_id=0")) + self.ws = MessageHandler(create_connection("ws://localhost:8013/network_ui/tester?topology_id=0")) self.ws.close() def test_bad_topology_id2(self): - self.ws = MessageHandler(create_connection("ws://localhost:8001/network_ui/tester?topology_id=foo")) + self.ws = MessageHandler(create_connection("ws://localhost:8013/network_ui/tester?topology_id=foo")) self.ws.close() def test_bad_sender(self): - self.ws = MessageHandler(create_connection("ws://localhost:8001/network_ui/tester?topology_id=143")) + self.ws = MessageHandler(create_connection("ws://localhost:8013/network_ui/tester?topology_id=143")) self.ws.ws.send(json.dumps(['DeviceCreate', dict(sender=-1, name="TestSwitchA", x=100, y=100, type="switch", id=100)])) self.ws.ws.send(json.dumps(['DeviceDestroy', dict(sender=-1, previous_name="TestSwitchA", previous_x=100, previous_y=100, previous_type="switch", id=100)])) self.ws.close() def test_unsupported_command(self): - self.ws = MessageHandler(create_connection("ws://localhost:8001/network_ui/tester?topology_id=143")) + self.ws = MessageHandler(create_connection("ws://localhost:8013/network_ui/tester?topology_id=143")) self.ws.recv() self.ws.recv() self.ws.send("NotSupported") diff --git a/awx/network_ui/routing.py b/awx/network_ui/routing.py index 2768cfe3bb..45c561231b 100644 --- a/awx/network_ui/routing.py +++ b/awx/network_ui/routing.py @@ -2,7 +2,6 @@ from channels.routing import route from awx.network_ui.consumers import ws_connect, ws_message, ws_disconnect, console_printer, persistence, discovery from awx.network_ui.consumers import ansible_connect, ansible_message, ansible_disconnect -from awx.network_ui.consumers import worker_connect, worker_message, worker_disconnect from awx.network_ui.consumers import tester_connect, tester_message, tester_disconnect from awx.network_ui.consumers import tables_connect, tables_message, tables_disconnect @@ -13,9 +12,6 @@ channel_routing = [ route("websocket.connect", ansible_connect, path=r"^/network_ui/ansible"), route("websocket.receive", ansible_message, path=r"^/network_ui/ansible"), route("websocket.disconnect", ansible_disconnect, path=r"^/network_ui/ansible"), - route("websocket.connect", worker_connect, path=r"^/network_ui/worker"), - route("websocket.receive", worker_message, path=r"^/network_ui/worker"), - route("websocket.disconnect", worker_disconnect, path=r"^/network_ui/worker"), route("websocket.connect", tester_connect, path=r"^/network_ui/tester"), route("websocket.receive", tester_message, path=r"^/network_ui/tester"), route("websocket.disconnect", tester_disconnect, path=r"^/network_ui/tester"), diff --git a/awx/network_ui/static/network_ui/Makefile b/awx/network_ui/static/network_ui/Makefile index a0f5e939fc..36a0fce41e 100644 --- a/awx/network_ui/static/network_ui/Makefile +++ b/awx/network_ui/static/network_ui/Makefile @@ -20,11 +20,11 @@ lint: lessc: lessc src/style.less css/style.css -istanbul: +istanbul: main istanbul instrument --output src-instrumented src - webpack src-instrumented/main.js js/bundle-instrumented.js + webpack --config webpack-instrumented.config.js cp index.html index-instrumented.html - sed -i "s/bundle.js/bundle-instrumented.js/g" index-instrumented.html + sed -i "s/\/bundle.js/\/bundle-instrumented.js/g" index-instrumented.html cp vendor/*.js js/ @@ -35,6 +35,8 @@ simple-server: lint main lessc deploy: main rsync -av src/ ../../../../awx/ui/client/src/network_ui/ +deploy-instrumented: istanbul + rsync -av src-instrumented/ ../../../../awx/ui/client/src/network_ui/ extract: mkdir -p extracted diff --git a/awx/network_ui/static/network_ui/package.json b/awx/network_ui/static/network_ui/package.json index ab0fbca2c8..6caa594b74 100644 --- a/awx/network_ui/static/network_ui/package.json +++ b/awx/network_ui/static/network_ui/package.json @@ -22,7 +22,8 @@ "reconnectingwebsocket": "^1.0.0", "require": "", "webpack": "", - "titlecase": "" + "titlecase": "", + "lodash": "" }, "devDependencies": { "eslint": "^3.17.1", diff --git a/awx/network_ui/static/network_ui/src/network.ui.controller.js b/awx/network_ui/static/network_ui/src/network.ui.controller.js index 539be390d8..6151847486 100644 --- a/awx/network_ui/static/network_ui/src/network.ui.controller.js +++ b/awx/network_ui/static/network_ui/src/network.ui.controller.js @@ -1,4 +1,5 @@ /* Copyright (c) 2017 Red Hat, Inc. */ +var _ = require('lodash'); var angular = require('angular'); var fsm = require('./fsm.js'); var null_fsm = require('./null.fsm.js'); @@ -21,21 +22,23 @@ var messages = require('./messages.js'); var svg_crowbar = require('./svg-crowbar.js'); var ReconnectingWebSocket = require('reconnectingwebsocket'); -var NetworkUIController = function($scope, $document, $location, $window, $http) { +var NetworkUIController = function($scope, $document, $location, $window, $http, $q) { window.scope = $scope; var i = 0; + $scope.http = $http; + $scope.api_token = ''; - $scope.disconnected = true; + $scope.disconnected = false; $scope.topology_id = $location.search().topology_id || 0; // Create a web socket to connect to the backend server // - $scope.inventory_id = $location.search().inventory_id || 0; + $scope.inventory_id = $location.search().inventory_id || 1; if (!$scope.disconnected) { - $scope.control_socket = new ReconnectingWebSocket("ws://" + window.location.host + "/network_ui/topology?topology_id=" + $scope.topology_id, + $scope.control_socket = new ReconnectingWebSocket("wss://" + window.location.host + "/network_ui/topology?topology_id=" + $scope.topology_id, null, {debug: false, reconnectInterval: 300}); } else { @@ -43,6 +46,7 @@ var NetworkUIController = function($scope, $document, $location, $window, $http) on_message: util.noop }; } + $scope.my_location = $location.protocol() + "://" + $location.host() + ':' + $location.port(); $scope.history = []; $scope.client_id = 0; $scope.onMouseDownResult = ""; @@ -143,23 +147,39 @@ var NetworkUIController = function($scope, $document, $location, $window, $http) //Inventory Toolbox Setup $scope.inventory_toolbox = new models.ToolBox(0, 'Inventory', 'device', 10, 200, 150, $scope.graph.height - 200 - 100); if (!$scope.disconnected) { + console.log($location.protocol() + "://" + $location.host() + ':' + $location.port()); + console.log($scope.my_location); + function add_host (host) { + console.log(host); + var device = new models.Device(0, host.data.name, 0, 0, host.data.type); + device.icon = true; + $scope.inventory_toolbox.items.push(device); + } $http.get('/api/v2/inventories/' + $scope.inventory_id + '/hosts/?format=json') - .then(function(response) { - console.log(response); + .then(function(inventory) { + console.log(inventory); + console.log(inventory.headers()); var host = null; var i = 0; - function add_host (response) { - console.log(response); - var device = new models.Device(0, response.data.name, 0, 0, response.data.type); - device.icon = true; - $scope.inventory_toolbox.items.push(device); - } - for (i=0; i