diff --git a/awx/network_ui/admin.py b/awx/network_ui/admin.py index b8befad0ad..57aa688909 100644 --- a/awx/network_ui/admin.py +++ b/awx/network_ui/admin.py @@ -30,7 +30,7 @@ from awx.network_ui.models import Process class DeviceAdmin(admin.ModelAdmin): - fields = ('topology', 'name', 'x', 'y', 'id', 'type', 'interface_id_seq',) + fields = ('topology', 'name', 'x', 'y', 'id', 'type', 'interface_id_seq', 'process_id_seq',) raw_id_fields = ('topology',) @@ -127,7 +127,7 @@ admin.site.register(DataSheet, DataSheetAdmin) class StreamAdmin(admin.ModelAdmin): fields = ('from_device', 'to_device', 'label', 'id',) - raw_id_fields = ('stream_id', 'from_device', 'to_device', 'label',) + raw_id_fields = ('stream_id', 'from_device', 'to_device',) admin.site.register(Stream, StreamAdmin) diff --git a/awx/network_ui/consumers.py b/awx/network_ui/consumers.py index 6d1e8de309..d98d06b3cf 100644 --- a/awx/network_ui/consumers.py +++ b/awx/network_ui/consumers.py @@ -5,6 +5,7 @@ from awx.network_ui.models import Topology, Device, Link, Client, TopologyHistor from awx.network_ui.models import Group as DeviceGroup from awx.network_ui.models import GroupDevice as GroupDeviceMap from awx.network_ui.models import DataSheet, DataBinding, DataType +from awx.network_ui.models import Process, Stream from awx.network_ui.serializers import yaml_serialize_topology import urlparse from django.db.models import Q @@ -366,6 +367,29 @@ class _Persistence(object): to_interface_id=Interface.objects.get(device_id=device_map[link['to_device_id']], id=link['to_interface_id']).pk).delete() + def onProcessCreate(self, process, topology_id, client_id): + Process.objects.get_or_create(device_id=Device.objects.get(id=process['device_id'], + topology_id=topology_id).pk, + id=process['id'], + defaults=dict(name=process['name'], type=process['type'])) + (Device.objects + .filter(id=process['device_id'], + topology_id=topology_id, + interface_id_seq__lt=process['id']) + .update(interface_id_seq=process['id'])) + + def onStreamCreate(self, stream, topology_id, client_id): + device_map = dict(Device.objects + .filter(topology_id=topology_id, id__in=[stream['from_id'], stream['to_id']]) + .values_list('id', 'pk')) + Stream.objects.get_or_create(id=stream['id'], + label=stream['label'], + from_device_id=device_map[stream['from_id']], + to_device_id=device_map[stream['to_id']]) + (Topology.objects + .filter(topology_id=topology_id, stream_id_seq__lt=stream['id']) + .update(stream_id_seq=stream['id'])) + def onDeviceSelected(self, message_value, topology_id, client_id): 'Ignore DeviceSelected messages' pass @@ -755,15 +779,21 @@ def ws_connect(message): def send_snapshot(channel, topology_id): interfaces = defaultdict(list) + processes = defaultdict(list) for i in (Interface.objects .filter(device__topology_id=topology_id) .values()): interfaces[i['device_id']].append(i) + for i in (Process.objects + .filter(device__topology_id=topology_id) + .values()): + processes[i['device_id']].append(i) devices = list(Device.objects .filter(topology_id=topology_id).values()) for device in devices: device['interfaces'] = interfaces[device['device_id']] + device['processes'] = processes[device['device_id']] links = [dict(id=x['id'], name=x['name'], @@ -789,10 +819,22 @@ def send_snapshot(channel, topology_id): else: group_map[group_id]['members'].append(device_id) + streams = [dict(id=x['id'], + label=x['label'], + from_id=x['from_device__id'], + to_id=x['to_device__id']) + for x in list(Stream.objects + .filter(Q(from_device__topology_id=topology_id) | + Q(to_device__topology_id=topology_id)).values('id', + 'label', + 'from_device__id', + 'to_device__id'))] + snapshot = dict(sender=0, devices=devices, links=links, - groups=groups) + groups=groups, + streams=streams) channel.send({"text": json.dumps(["Snapshot", snapshot])}) diff --git a/awx/network_ui/designs/models.yml b/awx/network_ui/designs/models.yml index 5eaf1d5f50..01e5362fe4 100644 --- a/awx/network_ui/designs/models.yml +++ b/awx/network_ui/designs/models.yml @@ -25,6 +25,9 @@ models: - default: 0 name: interface_id_seq type: IntegerField + - default: 0 + name: process_id_seq + type: IntegerField name: Device x: 348 y: 124 @@ -256,19 +259,17 @@ models: ref_field: stream_id type: AutoField - name: from_device - ref: Stream - ref_field: from_device + ref: Device + ref_field: device_id related_name: from_stream type: ForeignKey - name: to_device - ref: Stream - ref_field: to_device + ref: Device + ref_field: device_id related_name: to_stream type: ForeignKey - len: 200 name: label - ref: Stream - ref_field: label type: CharField - default: 0 name: id diff --git a/awx/network_ui/migrations/0019_auto_20170822_1723.py b/awx/network_ui/migrations/0019_auto_20170822_1723.py new file mode 100644 index 0000000000..26832b9791 --- /dev/null +++ b/awx/network_ui/migrations/0019_auto_20170822_1723.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('network_ui', '0018_auto_20170821_1557'), + ] + + operations = [ + migrations.AlterField( + model_name='stream', + name='from_device', + field=models.ForeignKey(related_name='from_stream', to='network_ui.Device'), + ), + migrations.AlterField( + model_name='stream', + name='label', + field=models.CharField(max_length=200), + ), + migrations.AlterField( + model_name='stream', + name='to_device', + field=models.ForeignKey(related_name='to_stream', to='network_ui.Device'), + ), + ] diff --git a/awx/network_ui/migrations/0020_device_process_id_seq.py b/awx/network_ui/migrations/0020_device_process_id_seq.py new file mode 100644 index 0000000000..76a056a62d --- /dev/null +++ b/awx/network_ui/migrations/0020_device_process_id_seq.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('network_ui', '0019_auto_20170822_1723'), + ] + + operations = [ + migrations.AddField( + model_name='device', + name='process_id_seq', + field=models.IntegerField(default=0), + ), + ] diff --git a/awx/network_ui/models.py b/awx/network_ui/models.py index bc6246518a..e870a3c81c 100644 --- a/awx/network_ui/models.py +++ b/awx/network_ui/models.py @@ -11,6 +11,7 @@ class Device(models.Model): id = models.IntegerField() type = models.CharField(max_length=200,) interface_id_seq = models.IntegerField(default=0) + process_id_seq = models.IntegerField(default=0) def __unicode__(self): return self.name @@ -128,9 +129,9 @@ class DataSheet(models.Model): class Stream(models.Model): stream_id = models.AutoField('Stream', primary_key=True,) - from_device = models.ForeignKey('Stream', related_name='from_stream',) - to_device = models.ForeignKey('Stream', related_name='to_stream',) - label = models.CharField('Stream', max_length=200,) + from_device = models.ForeignKey('Device', related_name='from_stream',) + to_device = models.ForeignKey('Device', related_name='to_stream',) + label = models.CharField(max_length=200,) id = models.IntegerField(default=0) diff --git a/awx/network_ui/serializers.py b/awx/network_ui/serializers.py index 0290d4ee42..5abd052c59 100644 --- a/awx/network_ui/serializers.py +++ b/awx/network_ui/serializers.py @@ -1,5 +1,5 @@ -from awx.network_ui.models import Topology, Device, Link, Interface, Group, GroupDevice +from awx.network_ui.models import Topology, Device, Link, Interface, Group, GroupDevice, Process, Stream from django.db.models import Q import yaml import json @@ -19,7 +19,8 @@ def topology_data(topology_id): data = dict(devices=[], links=[], - groups=[]) + groups=[], + streams=[]) topology = Topology.objects.get(pk=topology_id) @@ -46,6 +47,7 @@ def topology_data(topology_id): Q(to_device__topology_id=topology_id))) interfaces = Interface.objects.filter(device__topology_id=topology_id) + processes = Process.objects.filter(device__topology_id=topology_id) for device in Device.objects.filter(topology_id=topology_id).order_by('name'): interfaces = list(NetworkAnnotatedInterface.filter(device_id=device.pk).order_by('name')) @@ -55,12 +57,14 @@ def topology_data(topology_id): remote_interface_name=x['from_link__to_interface__name'] or x['to_link__from_interface__name'], id=x['id'], ) for x in interfaces] + processes = list(Process.objects.filter(device_id=device.pk).values()) data['devices'].append(dict(name=device.name, type=device.type, x=device.x, y=device.y, id=device.id, interfaces=interfaces, + processes=processes, groups=[x['group__name'] for x in device_group_map[device.device_id]])) for link in links: @@ -75,6 +79,18 @@ def topology_data(topology_id): name=link.name, network=link.pk)) + streams = list(Stream.objects + .filter(Q(from_device__topology_id=topology_id) | + Q(to_device__topology_id=topology_id))) + + for stream in streams: + data['streams'].append(dict(from_id=stream.from_device.id, + to_id=stream.to_device.id, + from_device=stream.from_device.name, + to_device=stream.to_device.name, + label=stream.label, + id=stream.id)) + return data diff --git a/awx/network_ui/static/network_ui/src/device.detail.fsm.js b/awx/network_ui/static/network_ui/src/device.detail.fsm.js index 3bc52d1131..4fc22cc67e 100644 --- a/awx/network_ui/static/network_ui/src/device.detail.fsm.js +++ b/awx/network_ui/static/network_ui/src/device.detail.fsm.js @@ -1,6 +1,7 @@ var inherits = require('inherits'); var fsm = require('./fsm.js'); var models = require('./models.js'); +var messages = require('./messages.js'); function _State () { } @@ -57,13 +58,20 @@ _Ready.prototype.onPasteProcess = function (controller, msg_type, message) { if (device.is_selected(x, y)) { console.log(device); - app = new models.Application(device.process_id_seq(), - message.process.name, - message.process.type, - controller.scope.scaledX, - controller.scope.scaledY); + app = new models.Process(device.process_id_seq(), + message.process.name, + message.process.type, + controller.scope.scaledX, + controller.scope.scaledY); + app.device = device; device.processes.push(app); - console.log(device.processes); + controller.scope.send_control_message(new messages.ProcessCreate(controller.scope.client_id, + app.id, + app.name, + app.type, + app.device.id, + app.x, + app.y)); break; } else { console.log([x,y, device.x, device.y]); diff --git a/awx/network_ui/static/network_ui/src/messages.js b/awx/network_ui/static/network_ui/src/messages.js index 6e848e4ddb..4862b36c9e 100644 --- a/awx/network_ui/static/network_ui/src/messages.js +++ b/awx/network_ui/static/network_ui/src/messages.js @@ -362,6 +362,17 @@ function TableCellEdit(sender, sheet, col, row, old_value, new_value) { } exports.TableCellEdit = TableCellEdit; +function ProcessCreate(sender, id, name, type, device_id, x, y) { + this.msg_type = "ProcessCreate"; + this.id = id; + this.name = name; + this.type = type; + this.device_id = device_id; + this.x = x; + this.y = y; +} +exports.ProcessCreate = ProcessCreate; + function StreamCreate(sender, id, from_id, to_id, label) { this.msg_type = "StreamCreate"; this.sender = sender; diff --git a/awx/network_ui/static/network_ui/src/models.js b/awx/network_ui/static/network_ui/src/models.js index 54b71a809e..76f297df25 100644 --- a/awx/network_ui/static/network_ui/src/models.js +++ b/awx/network_ui/static/network_ui/src/models.js @@ -596,7 +596,7 @@ function Configuration(id, name, type, x, y, content) { } exports.Configuration = Configuration; -function Application(id, name, type, x, y) { +function Process(id, name, type, x, y) { this.id = id; this.name = name; this.type = type; @@ -608,8 +608,9 @@ function Application(id, name, type, x, y) { this.selected = null; this.enabled = true; this.icon = false; + this.device = null; } -exports.Application = Application; +exports.Process = Process; function Stream(id, from_device, to_device, label) { this.id = id; diff --git a/awx/network_ui/static/network_ui/src/move.js b/awx/network_ui/static/network_ui/src/move.js index 4f29f0da98..d837169587 100644 --- a/awx/network_ui/static/network_ui/src/move.js +++ b/awx/network_ui/static/network_ui/src/move.js @@ -149,6 +149,7 @@ _Ready.prototype.onPasteDevice = function (controller, msg_type, message) { var intf = null; var process = null; var i = 0; + var c_messages = []; scope.pressedX = scope.mouseX; scope.pressedY = scope.mouseY; @@ -161,24 +162,37 @@ _Ready.prototype.onPasteDevice = function (controller, msg_type, message) { scope.scaledY, message.device.type); scope.devices.push(device); - scope.send_control_message(new messages.DeviceCreate(scope.client_id, - device.id, - device.x, - device.y, - device.name, - device.type)); + c_messages.push(new messages.DeviceCreate(scope.client_id, + device.id, + device.x, + device.y, + device.name, + device.type)); for (i=0; i < message.device.interfaces.length; i++) { intf = new models.Interface(message.device.interfaces[i].id, message.device.interfaces[i].name); device.interfaces.push(intf); + c_messages.push(new messages.InterfaceCreate(controller.scope.client_id, + device.id, + intf.id, + intf.name)); } for (i=0; i < message.device.processes.length; i++) { - process = new models.Application(message.device.processes[i].id, - message.device.processes[i].name, - message.device.processes[i].type, 0, 0); + process = new models.Process(message.device.processes[i].id, + message.device.processes[i].name, + message.device.processes[i].type, 0, 0); + process.device = device; + c_messages.push(new messages.ProcessCreate(controller.scope.client_id, + process.id, + process.name, + process.type, + process.device.id, + process.x, + process.y)); device.processes.push(process); } scope.selected_devices.push(device); device.selected = true; + scope.send_control_message(new messages.MultipleMessage(controller.scope.client_id, c_messages)); controller.changeState(Selected2); }; _Ready.prototype.onPasteDevice.transitions = ['Selected2']; @@ -229,7 +243,7 @@ _Selected2.prototype.onCopySelected = function (controller) { device_copy = new models.Device(0, devices[i].name, 0, 0, devices[i].type); device_copy.icon = true; for(j=0; j < devices[i].processes.length; j++) { - process_copy = new models.Application(0, devices[i].processes[j].name, devices[i].processes[j].name, 0, 0); + process_copy = new models.Process(0, devices[i].processes[j].name, devices[i].processes[j].name, 0, 0); device_copy.processes.push(process_copy); } for(j=0; j < devices[i].interfaces.length; j++) { 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 c05299cc1e..314cb394a1 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 @@ -26,7 +26,7 @@ var NetworkUIController = function($scope, $document, $location, $window) { var i = 0; $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 @@ -50,7 +50,6 @@ var NetworkUIController = function($scope, $document, $location, $window) { $scope.onMouseMoveResult = ""; $scope.current_scale = 1.0; $scope.current_mode = null; - $scope.current_location = ["Earth", "Site1", "Spine1", "Eth1"]; $scope.panX = 0; $scope.panY = 0; $scope.mouseX = 0; @@ -96,7 +95,6 @@ var NetworkUIController = function($scope, $document, $location, $window) { $scope.touch_data = {}; $scope.touches = []; $scope.devices = []; - $scope.stencils = []; $scope.links = []; $scope.groups = []; $scope.processes = []; @@ -121,17 +119,17 @@ var NetworkUIController = function($scope, $document, $location, $window) { $scope.time_controller = new fsm.FSMController($scope, time.Start, $scope.buttons_controller); $scope.app_toolbox_controller = new fsm.FSMController($scope, toolbox_fsm.Start, $scope.time_controller); //App Toolbox Setup - $scope.app_toolbox = new models.ToolBox(0, 'Application', 'app', 10, 200, 150, $scope.graph.height - 200 - 100); + $scope.app_toolbox = new models.ToolBox(0, 'Process', 'app', 10, 200, 150, $scope.graph.height - 200 - 100); $scope.app_toolbox.spacing = 150; $scope.app_toolbox.enabled = false; $scope.app_toolbox_controller.toolbox = $scope.app_toolbox; $scope.app_toolbox_controller.dropped_action = function (selected_item) { $scope.first_controller.handle_message("PasteProcess", new messages.PasteProcess(selected_item)); }; - $scope.app_toolbox.items.push(new models.Application(0, 'BGP', 'process', 0, 0)); - $scope.app_toolbox.items.push(new models.Application(0, 'OSPF', 'process', 0, 0)); - $scope.app_toolbox.items.push(new models.Application(0, 'STP', 'process', 0, 0)); - $scope.app_toolbox.items.push(new models.Application(0, 'Zero Pipeline', 'process', 0, 0)); + $scope.app_toolbox.items.push(new models.Process(0, 'BGP', 'process', 0, 0)); + $scope.app_toolbox.items.push(new models.Process(0, 'OSPF', 'process', 0, 0)); + $scope.app_toolbox.items.push(new models.Process(0, 'STP', 'process', 0, 0)); + $scope.app_toolbox.items.push(new models.Process(0, 'Zero Pipeline', 'process', 0, 0)); for(i = 0; i < $scope.app_toolbox.items.length; i++) { $scope.app_toolbox.items[i].icon = true; @@ -614,23 +612,9 @@ var NetworkUIController = function($scope, $document, $location, $window) { true) ]; - var STENCIL_X = 10; - var STENCIL_Y = 100; - var STENCIL_SPACING = 40; - - $scope.stencils = [ - new models.Button("Switch", STENCIL_X, STENCIL_Y + STENCIL_SPACING * 0, 70, 30, function () {$scope.first_controller.handle_message("NewDevice", new messages.NewDevice("switch"));}), - new models.Button("Router", STENCIL_X, STENCIL_Y + STENCIL_SPACING * 1, 70, 30, function () {$scope.first_controller.handle_message("NewDevice", new messages.NewDevice("router"));}), - new models.Button("Host", STENCIL_X, STENCIL_Y + STENCIL_SPACING * 2, 70, 30, function () {$scope.first_controller.handle_message("NewDevice", new messages.NewDevice("host"));}), - new models.Button("Link", STENCIL_X, STENCIL_Y + STENCIL_SPACING * 3, 70, 30, function () { $scope.first_controller.handle_message("NewLink");}), - new models.Button("Group", STENCIL_X, STENCIL_Y + STENCIL_SPACING * 4, 70, 30, function () { $scope.first_controller.handle_message("NewGroup", new messages.NewGroup("group"));}), - new models.Button("Site", STENCIL_X, STENCIL_Y + STENCIL_SPACING * 5, 70, 30, function () { $scope.first_controller.handle_message("NewGroup", new messages.NewGroup("site"));}), - ]; - $scope.all_buttons = []; $scope.all_buttons.extend($scope.buttons); $scope.all_buttons.extend($scope.layers); - $scope.all_buttons.extend($scope.stencils); $scope.onTaskStatus = function(data) { var i = 0; @@ -1140,12 +1124,16 @@ var NetworkUIController = function($scope, $document, $location, $window) { var max_device_id = null; var max_link_id = null; var max_group_id = null; + var max_stream_id = null; var min_x = null; var min_y = null; var max_x = null; var max_y = null; var new_link = null; var new_group = null; + var process = null; + var new_process = null; + var new_stream = null; //Build the devices for (i = 0; i < data.devices.length; i++) { @@ -1171,9 +1159,20 @@ var NetworkUIController = function($scope, $document, $location, $window) { device.y, device.type); new_device.interface_seq = util.natural_numbers(device.interface_id_seq); + new_device.process_id_seq = util.natural_numbers(device.process_id_seq); $scope.devices.push(new_device); device_map[device.id] = new_device; device_interface_map[device.id] = {}; + for (j = 0; j < device.processes.length; j++) { + process = device.processes[j]; + new_process = (new models.Process(process.id, + process.name, + process.type, + 0, + 0)); + new_process.device = new_device; + new_device.processes.push(new_process); + } for (j = 0; j < device.interfaces.length; j++) { intf = device.interfaces[j]; new_intf = (new models.Interface(intf.id, @@ -1202,6 +1201,20 @@ var NetworkUIController = function($scope, $document, $location, $window) { device_interface_map[link.to_device_id][link.to_interface_id].link = new_link; } + //Build the streams + var stream = null; + for (i = 0; i < data.streams.length; i++) { + stream = data.streams[i]; + if (max_stream_id === null || stream.id > max_stream_id) { + max_stream_id = stream.id; + } + new_stream = new models.Stream(stream.id, + device_map[stream.from_id], + device_map[stream.to_id], + stream.label); + $scope.streams.push(new_stream); + } + //Build the groups var group = null; for (i = 0; i < data.groups.length; i++) { @@ -1225,6 +1238,12 @@ var NetworkUIController = function($scope, $document, $location, $window) { $scope.groups.push(new_group); } + //Update group membership + + for (i = 0; i < $scope.groups.length; i++) { + $scope.groups[i].update_membership($scope.devices, $scope.groups); + } + var diff_x; var diff_y; @@ -1256,6 +1275,10 @@ var NetworkUIController = function($scope, $document, $location, $window) { if (max_link_id !== null) { $scope.link_id_seq = util.natural_numbers(max_link_id); } + //Update the stream_id_seq to be greater than all stream ids to prevent duplicate ids. + if (max_stream_id !== null) { + $scope.stream_id_seq = util.natural_numbers(max_stream_id); + } //Update the group_id_seq to be greater than all group ids to prevent duplicate ids. if (max_group_id !== null) { $scope.group_id_seq = util.natural_numbers(max_group_id); diff --git a/awx/network_ui/static/network_ui/src/network.widgets.controller.js b/awx/network_ui/static/network_ui/src/network.widgets.controller.js index e8b60572c5..ca7ea79869 100644 --- a/awx/network_ui/static/network_ui/src/network.widgets.controller.js +++ b/awx/network_ui/static/network_ui/src/network.widgets.controller.js @@ -42,7 +42,6 @@ var NetworkWidgetsController = function($scope, $document, $location, $window) { $scope.onMouseMoveResult = ""; $scope.current_scale = 1.01; $scope.current_mode = null; - $scope.current_location = []; $scope.panX = 100; $scope.panY = 100; $scope.mouseX = 0; @@ -113,17 +112,17 @@ var NetworkWidgetsController = function($scope, $document, $location, $window) { $scope.time_controller = new fsm.FSMController($scope, time.Start, $scope.buttons_controller); $scope.app_toolbox_controller = new fsm.FSMController($scope, toolbox_fsm.Start, $scope.time_controller); //App Toolbox Setup - $scope.app_toolbox = new models.ToolBox(0, 'Application', 'app', 10, 200, 150, $scope.graph.height - 200 - 100); + $scope.app_toolbox = new models.ToolBox(0, 'Process', 'app', 10, 200, 150, $scope.graph.height - 200 - 100); $scope.app_toolbox.spacing = 150; $scope.app_toolbox.enabled = false; $scope.app_toolbox_controller.toolbox = $scope.app_toolbox; $scope.app_toolbox_controller.dropped_action = function (selected_item) { $scope.first_controller.handle_message("PasteProcess", new messages.PasteProcess(selected_item)); }; - $scope.app_toolbox.items.push(new models.Application(0, 'BGP', 'process', 0, 0)); - $scope.app_toolbox.items.push(new models.Application(0, 'OSPF', 'process', 0, 0)); - $scope.app_toolbox.items.push(new models.Application(0, 'STP', 'process', 0, 0)); - $scope.app_toolbox.items.push(new models.Application(0, 'Zero Pipeline', 'process', 0, 0)); + $scope.app_toolbox.items.push(new models.Process(0, 'BGP', 'process', 0, 0)); + $scope.app_toolbox.items.push(new models.Process(0, 'OSPF', 'process', 0, 0)); + $scope.app_toolbox.items.push(new models.Process(0, 'STP', 'process', 0, 0)); + $scope.app_toolbox.items.push(new models.Process(0, 'Zero Pipeline', 'process', 0, 0)); for(i = 0; i < $scope.app_toolbox.items.length; i++) { $scope.app_toolbox.items[i].icon = true; diff --git a/awx/network_ui/static/network_ui/src/rack.fsm.js b/awx/network_ui/static/network_ui/src/rack.fsm.js index 948410b8de..a55219a880 100644 --- a/awx/network_ui/static/network_ui/src/rack.fsm.js +++ b/awx/network_ui/static/network_ui/src/rack.fsm.js @@ -88,6 +88,7 @@ _Ready.prototype.onPasteRack = function (controller, msg_type, message) { var j = 0; var top_left_x, top_left_y; var device_map = {}; + var c_messages = []; scope.hide_groups = false; scope.pressedX = scope.mouseX; @@ -106,14 +107,14 @@ _Ready.prototype.onPasteRack = function (controller, msg_type, message) { top_left_y + message.group.y2, false); - scope.send_control_message(new messages.GroupCreate(scope.client_id, - group.id, - group.x1, - group.y1, - group.x2, - group.y2, - group.name, - group.type)); + c_messages.push(new messages.GroupCreate(scope.client_id, + group.id, + group.x1, + group.y1, + group.x2, + group.y2, + group.name, + group.type)); scope.groups.push(group); @@ -128,22 +129,34 @@ _Ready.prototype.onPasteRack = function (controller, msg_type, message) { device.interface_map = {}; scope.devices.push(device); group.devices.push(device); - scope.send_control_message(new messages.DeviceCreate(scope.client_id, - device.id, - device.x, - device.y, - device.name, - device.type)); + c_messages.push(new messages.DeviceCreate(scope.client_id, + device.id, + device.x, + device.y, + device.name, + device.type)); for (j=0; j < message.group.devices[i].interfaces.length; j++) { intf = new models.Interface(message.group.devices[i].interfaces[j].id, message.group.devices[i].interfaces[j].name); intf.device = device; device.interfaces.push(intf); device.interface_map[intf.id] = intf; + c_messages.push(new messages.InterfaceCreate(controller.scope.client_id, + device.id, + intf.id, + intf.name)); } for (j=0; j < message.group.devices[i].processes.length; j++) { - process = new models.Application(message.group.devices[i].processes[j].id, - message.group.devices[i].processes[j].name, - message.group.devices[i].processes[j].type, 0, 0); + process = new models.Process(message.group.devices[i].processes[j].id, + message.group.devices[i].processes[j].name, + message.group.devices[i].processes[j].type, 0, 0); + process.device = device; + c_messages.push(new messages.ProcessCreate(controller.scope.client_id, + process.id, + process.name, + process.type, + process.device.id, + process.x, + process.y)); device.processes.push(process); } } @@ -160,7 +173,15 @@ _Ready.prototype.onPasteRack = function (controller, msg_type, message) { device_map[message.group.links[i].from_device.id].interface_map[message.group.links[i].from_interface.id].dot(); device_map[message.group.links[i].to_device.id].interface_map[message.group.links[i].to_interface.id].dot(); scope.links.push(link); + c_messages.push(new messages.LinkCreate(controller.scope.client_id, + link.id, + link.from_device.id, + link.to_device.id, + link.from_interface.id, + link.to_interface.id)); } + + scope.send_control_message(new messages.MultipleMessage(controller.scope.client_id, c_messages)); }; @@ -223,7 +244,7 @@ _Selected2.prototype.onCopySelected = function (controller) { device_copy.icon = true; device_copy.interface_map = {}; for(k=0; k < devices[j].processes.length; k++) { - process_copy = new models.Application(0, devices[j].processes[k].name, devices[j].processes[k].name, 0, 0); + process_copy = new models.Process(0, devices[j].processes[k].name, devices[j].processes[k].name, 0, 0); device_copy.processes.push(process_copy); } for(k=0; k < devices[j].interfaces.length; k++) { @@ -436,7 +457,9 @@ _Move.prototype.onMouseMove = function (controller) { var j = 0; var k = 0; var previous_x1, previous_y1, previous_x2, previous_y2, previous_x, previous_y; + var c_messages = []; for (i = 0; i < groups.length; i++) { + c_messages = []; previous_x1 = groups[i].x1; previous_y1 = groups[i].y1; previous_x2 = groups[i].x2; @@ -446,16 +469,16 @@ _Move.prototype.onMouseMove = function (controller) { groups[i].x2 = groups[i].x2 + diffX; groups[i].y2 = groups[i].y2 + diffY; - controller.scope.send_control_message(new messages.GroupMove(controller.scope.client_id, - groups[i].id, - groups[i].x1, - groups[i].y1, - groups[i].x2, - groups[i].y2, - previous_x1, - previous_y1, - previous_x2, - previous_y2)); + c_messages.push(new messages.GroupMove(controller.scope.client_id, + groups[i].id, + groups[i].x1, + groups[i].y1, + groups[i].x2, + groups[i].y2, + previous_x1, + previous_y1, + previous_x2, + previous_y2)); devices = groups[i].devices; @@ -471,13 +494,15 @@ _Move.prototype.onMouseMove = function (controller) { devices[j].interfaces[k].link.from_interface.dot(); } } - controller.scope.send_control_message(new messages.DeviceMove(controller.scope.client_id, - devices[j].id, - devices[j].x, - devices[j].y, - previous_x, - previous_y)); + c_messages.push(new messages.DeviceMove(controller.scope.client_id, + devices[j].id, + devices[j].x, + devices[j].y, + previous_x, + previous_y)); } + + controller.scope.send_control_message(new messages.MultipleMessage(controller.scope.client_id, c_messages)); } controller.scope.pressedScaledX = controller.scope.scaledX; controller.scope.pressedScaledY = controller.scope.scaledY; diff --git a/awx/network_ui/static/network_ui/src/site.fsm.js b/awx/network_ui/static/network_ui/src/site.fsm.js index 59d407fc28..6f04f6b888 100644 --- a/awx/network_ui/static/network_ui/src/site.fsm.js +++ b/awx/network_ui/static/network_ui/src/site.fsm.js @@ -90,6 +90,7 @@ _Ready.prototype.onPasteSite = function (controller, msg_type, message) { var top_left_x, top_left_y; var device_map = {}; var inner_group = null; + var c_messages = []; scope.hide_groups = false; scope.pressedX = scope.mouseX; @@ -108,14 +109,14 @@ _Ready.prototype.onPasteSite = function (controller, msg_type, message) { top_left_y + message.group.y2, false); - scope.send_control_message(new messages.GroupCreate(scope.client_id, - group.id, - group.x1, - group.y1, - group.x2, - group.y2, - group.name, - group.type)); + c_messages.push(new messages.GroupCreate(scope.client_id, + group.id, + group.x1, + group.y1, + group.x2, + group.y2, + group.name, + group.type)); scope.groups.push(group); @@ -130,22 +131,34 @@ _Ready.prototype.onPasteSite = function (controller, msg_type, message) { device.interface_map = {}; scope.devices.push(device); group.devices.push(device); - scope.send_control_message(new messages.DeviceCreate(scope.client_id, - device.id, - device.x, - device.y, - device.name, - device.type)); + c_messages.push(new messages.DeviceCreate(scope.client_id, + device.id, + device.x, + device.y, + device.name, + device.type)); for (j=0; j < message.group.devices[i].interfaces.length; j++) { intf = new models.Interface(message.group.devices[i].interfaces[j].id, message.group.devices[i].interfaces[j].name); intf.device = device; device.interfaces.push(intf); device.interface_map[intf.id] = intf; + c_messages.push(new messages.InterfaceCreate(controller.scope.client_id, + device.id, + intf.id, + intf.name)); } for (j=0; j < message.group.devices[i].processes.length; j++) { - process = new models.Application(message.group.devices[i].processes[j].id, - message.group.devices[i].processes[j].name, - message.group.devices[i].processes[j].type, 0, 0); + process = new models.Process(message.group.devices[i].processes[j].id, + message.group.devices[i].processes[j].name, + message.group.devices[i].processes[j].type, 0, 0); + process.device = device; + c_messages.push(new messages.ProcessCreate(controller.scope.client_id, + process.id, + process.name, + process.type, + process.device.id, + process.x, + process.y)); device.processes.push(process); } } @@ -162,14 +175,25 @@ _Ready.prototype.onPasteSite = function (controller, msg_type, message) { device_map[message.group.links[i].from_device.id].interface_map[message.group.links[i].from_interface.id].dot(); device_map[message.group.links[i].to_device.id].interface_map[message.group.links[i].to_interface.id].dot(); scope.links.push(link); + c_messages.push(new messages.LinkCreate(controller.scope.client_id, + link.id, + link.from_device.id, + link.to_device.id, + link.from_interface.id, + link.to_interface.id)); } for(i=0; i - - - - - - - - {{l}} -