Cleans up feature set for 3.3

This removes the experimental features that were not selected
for 3.3 release.

* Removes dpath requirement
* Removes generated action_plugins
* Removes network UI v1 api
* Removes unused network management commands
* Removes network UI CLI client
* Removes templates
* Removes unused DataBinding models
* Removes obsolete test
* Removes unused admin and tests
* Removes experimental UndoPersistence, RedoPersistence, and auto-layout functions
* Removes API endpoints for network visualization
* Removes unused consumer routes
* Removes group, site, and rack features for 3.3
* Removes unused tables controller
* Removes undo/redo
* Removes group code and scale checks
This commit is contained in:
Ben Thomasson 2018-02-22 14:41:53 -05:00
parent 8d28748451
commit b29a605800
No known key found for this signature in database
GPG Key ID: 5818EF4CC895D5F5
217 changed files with 69 additions and 16430 deletions

View File

@ -1,120 +0,0 @@
.PHONY: all models admin v1_api_serializers v1_api_views v1_api_urls v2_api_serializers v2_api_views v1_api_client v2_api_urls v2_api_access v2_api_client
all: tuples models admin v1_api_serializers v1_api_views v1_api_urls v2_api_serializers v2_api_views v1_api_client action_plugins v2_api_urls v2_api_access v2_api_client
tuples:
jinja2 templates/tuples.pyt designs/models.yml > tuples.py
autopep8 -i tuples.py --ignore-local-config --max-line-length 160
models:
jinja2 templates/models.pyt designs/models.yml > models.py
autopep8 -i models.py --ignore-local-config --max-line-length 160
admin:
jinja2 templates/admin.pyt designs/models.yml > admin.py
autopep8 -i admin.py --ignore-local-config --max-line-length 160
v1_api_serializers:
jinja2 templates/v1_api_serializers.pyt designs/models.yml > v1_api_serializers.py
autopep8 -i v1_api_serializers.py --ignore-local-config --max-line-length 160
v1_api_views:
jinja2 templates/v1_api_views.pyt designs/models.yml > v1_api_views.py
autopep8 -i v1_api_views.py --ignore-local-config --max-line-length 80
v1_api_urls:
jinja2 templates/v1_api_urls.pyt designs/models.yml > v1_api_urls.py
autopep8 -i v1_api_urls.py --ignore-local-config --max-line-length 160
v2_api_urls:
jinja2 templates/v2_api_urls.pyt designs/models.yml > v2_api_urls.py
autopep8 -i v2_api_urls.py --ignore-local-config --max-line-length 160
v2_api_access:
jinja2 templates/v2_api_access.pyt designs/models.yml > v2_api_access.py
autopep8 -i v2_api_access.py --ignore-local-config --max-line-length 160
v2_api_serializers:
jinja2 templates/v2_api_serializers.pyt designs/models.yml > v2_api_serializers.py
autopep8 -i v2_api_serializers.py --ignore-local-config --max-line-length 160
v2_api_views:
jinja2 templates/v2_api_views.pyt designs/models.yml > v2_api_views.py
autopep8 -i v2_api_views.py --ignore-local-config --max-line-length 160
v1_api_client:
jinja2 templates/v1_api_client.pyt designs/models.yml > client/v1_api_client.py
autopep8 -i client/v1_api_client.py --ignore-local-config --max-line-length 160
v2_api_client:
jinja2 templates/v2_api_client.pyt designs/models.yml > client/v2_api_client.py
autopep8 -i client/v2_api_client.py --ignore-local-config --max-line-length 160
action_plugins: ap_create_model ap_get_model ap_delete_model ap_update_model ap_list_model
ap_create_model:
jinja2 templates/action_plugins/create_model.pyt designs/models.yml > action_plugins/create_model.py
cd action_plugins; csplit -k -f create_ create_model.py '/#----/' '{*}'
rm action_plugins/create_model.py
./tools/fix_action_plugin_names.py action_plugins/create_*
autopep8 -i action_plugins/create_*.py --ignore-local-config --max-line-length 160
jinja2 templates/library/create_model.pyt designs/models.yml > library/create_model.py
cd library; csplit -k -f create_ create_model.py '/#----/' '{*}'
rm library/create_model.py
./tools/fix_action_plugin_names.py library/create_*
autopep8 -i library/create_*.py --ignore-local-config --max-line-length 160
ap_update_model:
jinja2 templates/action_plugins/update_model.pyt designs/models.yml > action_plugins/update_model.py
cd action_plugins; csplit -k -f update_ update_model.py '/#----/' '{*}'
rm action_plugins/update_model.py
./tools/fix_action_plugin_names.py action_plugins/update_*
autopep8 -i action_plugins/update_*.py --ignore-local-config --max-line-length 160
jinja2 templates/library/update_model.pyt designs/models.yml > library/update_model.py
cd library; csplit -k -f update_ update_model.py '/#----/' '{*}'
rm library/update_model.py
./tools/fix_action_plugin_names.py library/update_*
autopep8 -i library/update_*.py --ignore-local-config --max-line-length 160
ap_get_model:
jinja2 templates/action_plugins/get_model.pyt designs/models.yml > action_plugins/get_model.py
cd action_plugins; csplit -k -f get_ get_model.py '/#----/' '{*}'
rm action_plugins/get_model.py
./tools/fix_action_plugin_names.py action_plugins/get_*
autopep8 -i action_plugins/get_*.py --ignore-local-config --max-line-length 160
jinja2 templates/library/get_model.pyt designs/models.yml > library/get_model.py
cd library; csplit -k -f get_ get_model.py '/#----/' '{*}'
rm library/get_model.py
./tools/fix_action_plugin_names.py library/get_*
autopep8 -i library/get_*.py --ignore-local-config --max-line-length 160
ap_delete_model:
jinja2 templates/action_plugins/delete_model.pyt designs/models.yml > action_plugins/delete_model.py
cd action_plugins; csplit -k -f delete_ delete_model.py '/#----/' '{*}'
rm action_plugins/delete_model.py
./tools/fix_action_plugin_names.py action_plugins/delete_*
autopep8 -i action_plugins/delete_*.py --ignore-local-config --max-line-length 160
jinja2 templates/library/delete_model.pyt designs/models.yml > library/delete_model.py
cd library; csplit -k -f delete_ delete_model.py '/#----/' '{*}'
rm library/delete_model.py
./tools/fix_action_plugin_names.py library/delete_*
autopep8 -i library/delete_*.py --ignore-local-config --max-line-length 160
ap_list_model:
jinja2 templates/action_plugins/list_model.pyt designs/models.yml > action_plugins/list_model.py
cd action_plugins; csplit -k -f list_ list_model.py '/#----/' '{*}'
rm action_plugins/list_model.py
./tools/fix_action_plugin_names.py action_plugins/list_*
autopep8 -i action_plugins/list_*.py --ignore-local-config --max-line-length 160
jinja2 templates/library/list_model.pyt designs/models.yml > library/list_model.py
cd library; csplit -k -f list_ list_model.py '/#----/' '{*}'
rm library/list_model.py
./tools/fix_action_plugin_names.py library/list_*
autopep8 -i library/list_*.py --ignore-local-config --max-line-length 160

View File

@ -1,61 +0,0 @@
#---- create_device
from ansible.plugins.action import ActionBase
import requests
import json
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
the_list = self._task.args.get('list', None)
list_var = self._task.args.get('list_var', None)
topology = self._task.args.get('topology', None)
name = self._task.args.get('name', None)
x = self._task.args.get('x', None)
y = self._task.args.get('y', None)
id = self._task.args.get('id', None)
device_type = self._task.args.get('device_type', None)
interface_id_seq = self._task.args.get('interface_id_seq', 0)
process_id_seq = self._task.args.get('process_id_seq', 0)
host_id = self._task.args.get('host_id', 0)
url = server + '/api/v2/canvas/device/'
headers = {'content-type': 'application/json'}
response = requests.post(url, data=json.dumps(dict(topology=topology,
name=name,
x=x,
y=y,
id=id,
device_type=device_type,
interface_id_seq=interface_id_seq,
process_id_seq=process_id_seq,
host_id=host_id,
)),
verify=False,
auth=(user, password),
headers=headers)
if var is not None:
result['ansible_facts'] = {var: response.json()}
elif list_var is not None:
if the_list is None:
the_list = []
the_list.append(response.json())
result['ansible_facts'] = {list_var: the_list}
return result

View File

@ -1,61 +0,0 @@
#---- create_group
from ansible.plugins.action import ActionBase
import requests
import json
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
the_list = self._task.args.get('list', None)
list_var = self._task.args.get('list_var', None)
id = self._task.args.get('id', None)
name = self._task.args.get('name', None)
x1 = self._task.args.get('x1', None)
y1 = self._task.args.get('y1', None)
x2 = self._task.args.get('x2', None)
y2 = self._task.args.get('y2', None)
topology = self._task.args.get('topology', None)
group_type = self._task.args.get('group_type', None)
inventory_group_id = self._task.args.get('inventory_group_id', 0)
url = server + '/api/v2/canvas/group/'
headers = {'content-type': 'application/json'}
response = requests.post(url, data=json.dumps(dict(id=id,
name=name,
x1=x1,
y1=y1,
x2=x2,
y2=y2,
topology=topology,
group_type=group_type,
inventory_group_id=inventory_group_id,
)),
verify=False,
auth=(user, password),
headers=headers)
if var is not None:
result['ansible_facts'] = {var: response.json()}
elif list_var is not None:
if the_list is None:
the_list = []
the_list.append(response.json())
result['ansible_facts'] = {list_var: the_list}
return result

View File

@ -1,46 +0,0 @@
#---- create_groupdevice
from ansible.plugins.action import ActionBase
import requests
import json
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
the_list = self._task.args.get('list', None)
list_var = self._task.args.get('list_var', None)
group = self._task.args.get('group', None)
device = self._task.args.get('device', None)
url = server + '/api/v2/canvas/groupdevice/'
headers = {'content-type': 'application/json'}
response = requests.post(url, data=json.dumps(dict(group=group,
device=device,
)),
verify=False,
auth=(user, password),
headers=headers)
if var is not None:
result['ansible_facts'] = {var: response.json()}
elif list_var is not None:
if the_list is None:
the_list = []
the_list.append(response.json())
result['ansible_facts'] = {list_var: the_list}
return result

View File

@ -1,48 +0,0 @@
#---- create_interface
from ansible.plugins.action import ActionBase
import requests
import json
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
the_list = self._task.args.get('list', None)
list_var = self._task.args.get('list_var', None)
device = self._task.args.get('device', None)
name = self._task.args.get('name', None)
id = self._task.args.get('id', None)
url = server + '/api/v2/canvas/interface/'
headers = {'content-type': 'application/json'}
response = requests.post(url, data=json.dumps(dict(device=device,
name=name,
id=id,
)),
verify=False,
auth=(user, password),
headers=headers)
if var is not None:
result['ansible_facts'] = {var: response.json()}
elif list_var is not None:
if the_list is None:
the_list = []
the_list.append(response.json())
result['ansible_facts'] = {list_var: the_list}
return result

View File

@ -1,54 +0,0 @@
#---- create_link
from ansible.plugins.action import ActionBase
import requests
import json
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
the_list = self._task.args.get('list', None)
list_var = self._task.args.get('list_var', None)
from_device = self._task.args.get('from_device', None)
to_device = self._task.args.get('to_device', None)
from_interface = self._task.args.get('from_interface', None)
to_interface = self._task.args.get('to_interface', None)
id = self._task.args.get('id', None)
name = self._task.args.get('name', None)
url = server + '/api/v2/canvas/link/'
headers = {'content-type': 'application/json'}
response = requests.post(url, data=json.dumps(dict(from_device=from_device,
to_device=to_device,
from_interface=from_interface,
to_interface=to_interface,
id=id,
name=name,
)),
verify=False,
auth=(user, password),
headers=headers)
if var is not None:
result['ansible_facts'] = {var: response.json()}
elif list_var is not None:
if the_list is None:
the_list = []
the_list.append(response.json())
result['ansible_facts'] = {list_var: the_list}
return result

View File

@ -1,51 +0,0 @@
#---- create_process
from ansible.plugins.action import ActionBase
import requests
import json
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
the_list = self._task.args.get('list', None)
list_var = self._task.args.get('list_var', None)
device = self._task.args.get('device', None)
name = self._task.args.get('name', None)
process_type = self._task.args.get('process_type', None)
id = self._task.args.get('id', 0)
url = server + '/api/v2/canvas/process/'
headers = {'content-type': 'application/json'}
response = requests.post(url, data=json.dumps(dict(device=device,
name=name,
process_type=process_type,
id=id,
)),
verify=False,
auth=(user, password),
headers=headers)
if var is not None:
result['ansible_facts'] = {var: response.json()}
elif list_var is not None:
if the_list is None:
the_list = []
the_list.append(response.json())
result['ansible_facts'] = {list_var: the_list}
return result

View File

@ -1,51 +0,0 @@
#---- create_stream
from ansible.plugins.action import ActionBase
import requests
import json
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
the_list = self._task.args.get('list', None)
list_var = self._task.args.get('list_var', None)
from_device = self._task.args.get('from_device', None)
to_device = self._task.args.get('to_device', None)
label = self._task.args.get('label', None)
id = self._task.args.get('id', 0)
url = server + '/api/v2/canvas/stream/'
headers = {'content-type': 'application/json'}
response = requests.post(url, data=json.dumps(dict(from_device=from_device,
to_device=to_device,
label=label,
id=id,
)),
verify=False,
auth=(user, password),
headers=headers)
if var is not None:
result['ansible_facts'] = {var: response.json()}
elif list_var is not None:
if the_list is None:
the_list = []
the_list.append(response.json())
result['ansible_facts'] = {list_var: the_list}
return result

View File

@ -1,44 +0,0 @@
#---- create_toolbox
from ansible.plugins.action import ActionBase
import requests
import json
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
the_list = self._task.args.get('list', None)
list_var = self._task.args.get('list_var', None)
name = self._task.args.get('name', None)
url = server + '/api/v2/canvas/toolbox/'
headers = {'content-type': 'application/json'}
response = requests.post(url, data=json.dumps(dict(name=name,
)),
verify=False,
auth=(user, password),
headers=headers)
if var is not None:
result['ansible_facts'] = {var: response.json()}
elif list_var is not None:
if the_list is None:
the_list = []
the_list.append(response.json())
result['ansible_facts'] = {list_var: the_list}
return result

View File

@ -1,46 +0,0 @@
#---- create_toolboxitem
from ansible.plugins.action import ActionBase
import requests
import json
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
the_list = self._task.args.get('list', None)
list_var = self._task.args.get('list_var', None)
toolbox = self._task.args.get('toolbox', None)
data = self._task.args.get('data', None)
url = server + '/api/v2/canvas/toolboxitem/'
headers = {'content-type': 'application/json'}
response = requests.post(url, data=json.dumps(dict(toolbox=toolbox,
data=data,
)),
verify=False,
auth=(user, password),
headers=headers)
if var is not None:
result['ansible_facts'] = {var: response.json()}
elif list_var is not None:
if the_list is None:
the_list = []
the_list.append(response.json())
result['ansible_facts'] = {list_var: the_list}
return result

View File

@ -1,59 +0,0 @@
#---- create_topology
from ansible.plugins.action import ActionBase
import requests
import json
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
the_list = self._task.args.get('list', None)
list_var = self._task.args.get('list_var', None)
name = self._task.args.get('name', None)
scale = self._task.args.get('scale', None)
panX = self._task.args.get('panX', None)
panY = self._task.args.get('panY', None)
device_id_seq = self._task.args.get('device_id_seq', 0)
link_id_seq = self._task.args.get('link_id_seq', 0)
group_id_seq = self._task.args.get('group_id_seq', 0)
stream_id_seq = self._task.args.get('stream_id_seq', 0)
url = server + '/api/v2/canvas/topology/'
headers = {'content-type': 'application/json'}
response = requests.post(url, data=json.dumps(dict(name=name,
scale=scale,
panX=panX,
panY=panY,
device_id_seq=device_id_seq,
link_id_seq=link_id_seq,
group_id_seq=group_id_seq,
stream_id_seq=stream_id_seq,
)),
verify=False,
auth=(user, password),
headers=headers)
if var is not None:
result['ansible_facts'] = {var: response.json()}
elif list_var is not None:
if the_list is None:
the_list = []
the_list.append(response.json())
result['ansible_facts'] = {list_var: the_list}
return result

View File

@ -1,46 +0,0 @@
#---- create_topologyinventory
from ansible.plugins.action import ActionBase
import requests
import json
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
the_list = self._task.args.get('list', None)
list_var = self._task.args.get('list_var', None)
topology = self._task.args.get('topology', None)
inventory_id = self._task.args.get('inventory_id', None)
url = server + '/api/v2/canvas/topologyinventory/'
headers = {'content-type': 'application/json'}
response = requests.post(url, data=json.dumps(dict(topology=topology,
inventory_id=inventory_id,
)),
verify=False,
auth=(user, password),
headers=headers)
if var is not None:
result['ansible_facts'] = {var: response.json()}
elif list_var is not None:
if the_list is None:
the_list = []
the_list.append(response.json())
result['ansible_facts'] = {list_var: the_list}
return result

View File

@ -1,29 +0,0 @@
#---- delete_device
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
device_id = self._task.args.get('device_id', None)
url = server + '/api/v2/canvas/device/' + str(device_id) + '/'
requests.delete(url,
verify=False,
auth=(user, password))
return result

View File

@ -1,29 +0,0 @@
#---- delete_group
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
group_id = self._task.args.get('group_id', None)
url = server + '/api/v2/canvas/group/' + str(group_id) + '/'
requests.delete(url,
verify=False,
auth=(user, password))
return result

View File

@ -1,29 +0,0 @@
#---- delete_groupdevice
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
group_device_id = self._task.args.get('group_device_id', None)
url = server + '/api/v2/canvas/groupdevice/' + str(group_device_id) + '/'
requests.delete(url,
verify=False,
auth=(user, password))
return result

View File

@ -1,29 +0,0 @@
#---- delete_interface
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
interface_id = self._task.args.get('interface_id', None)
url = server + '/api/v2/canvas/interface/' + str(interface_id) + '/'
requests.delete(url,
verify=False,
auth=(user, password))
return result

View File

@ -1,29 +0,0 @@
#---- delete_link
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
link_id = self._task.args.get('link_id', None)
url = server + '/api/v2/canvas/link/' + str(link_id) + '/'
requests.delete(url,
verify=False,
auth=(user, password))
return result

View File

@ -1,29 +0,0 @@
#---- delete_process
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
process_id = self._task.args.get('process_id', None)
url = server + '/api/v2/canvas/process/' + str(process_id) + '/'
requests.delete(url,
verify=False,
auth=(user, password))
return result

View File

@ -1,29 +0,0 @@
#---- delete_stream
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
stream_id = self._task.args.get('stream_id', None)
url = server + '/api/v2/canvas/stream/' + str(stream_id) + '/'
requests.delete(url,
verify=False,
auth=(user, password))
return result

View File

@ -1,29 +0,0 @@
#---- delete_toolbox
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
toolbox_id = self._task.args.get('toolbox_id', None)
url = server + '/api/v2/canvas/toolbox/' + str(toolbox_id) + '/'
requests.delete(url,
verify=False,
auth=(user, password))
return result

View File

@ -1,29 +0,0 @@
#---- delete_toolboxitem
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
toolbox_item_id = self._task.args.get('toolbox_item_id', None)
url = server + '/api/v2/canvas/toolboxitem/' + str(toolbox_item_id) + '/'
requests.delete(url,
verify=False,
auth=(user, password))
return result

View File

@ -1,29 +0,0 @@
#---- delete_topology
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
topology_id = self._task.args.get('topology_id', None)
url = server + '/api/v2/canvas/topology/' + str(topology_id) + '/'
requests.delete(url,
verify=False,
auth=(user, password))
return result

View File

@ -1,29 +0,0 @@
#---- delete_topologyinventory
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
topology_inventory_id = self._task.args.get('topology_inventory_id', None)
url = server + '/api/v2/canvas/topologyinventory/' + str(topology_inventory_id) + '/'
requests.delete(url,
verify=False,
auth=(user, password))
return result

View File

@ -1,32 +0,0 @@
#---- get_device
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
device_id = self._task.args.get('device_id', None)
url = server + '/api/v2/canvas/device/' + str(device_id) + '/'
response = requests.get(url,
verify=False,
auth=(user, password))
result['ansible_facts'] = {var: response.json()}
return result

View File

@ -1,32 +0,0 @@
#---- get_group
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
group_id = self._task.args.get('group_id', None)
url = server + '/api/v2/canvas/group/' + str(group_id) + '/'
response = requests.get(url,
verify=False,
auth=(user, password))
result['ansible_facts'] = {var: response.json()}
return result

View File

@ -1,32 +0,0 @@
#---- get_groupdevice
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
group_device_id = self._task.args.get('group_device_id', None)
url = server + '/api/v2/canvas/groupdevice/' + str(group_device_id) + '/'
response = requests.get(url,
verify=False,
auth=(user, password))
result['ansible_facts'] = {var: response.json()}
return result

View File

@ -1,32 +0,0 @@
#---- get_interface
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
interface_id = self._task.args.get('interface_id', None)
url = server + '/api/v2/canvas/interface/' + str(interface_id) + '/'
response = requests.get(url,
verify=False,
auth=(user, password))
result['ansible_facts'] = {var: response.json()}
return result

View File

@ -1,32 +0,0 @@
#---- get_link
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
link_id = self._task.args.get('link_id', None)
url = server + '/api/v2/canvas/link/' + str(link_id) + '/'
response = requests.get(url,
verify=False,
auth=(user, password))
result['ansible_facts'] = {var: response.json()}
return result

View File

@ -1,32 +0,0 @@
#---- get_process
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
process_id = self._task.args.get('process_id', None)
url = server + '/api/v2/canvas/process/' + str(process_id) + '/'
response = requests.get(url,
verify=False,
auth=(user, password))
result['ansible_facts'] = {var: response.json()}
return result

View File

@ -1,32 +0,0 @@
#---- get_stream
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
stream_id = self._task.args.get('stream_id', None)
url = server + '/api/v2/canvas/stream/' + str(stream_id) + '/'
response = requests.get(url,
verify=False,
auth=(user, password))
result['ansible_facts'] = {var: response.json()}
return result

View File

@ -1,32 +0,0 @@
#---- get_toolbox
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
toolbox_id = self._task.args.get('toolbox_id', None)
url = server + '/api/v2/canvas/toolbox/' + str(toolbox_id) + '/'
response = requests.get(url,
verify=False,
auth=(user, password))
result['ansible_facts'] = {var: response.json()}
return result

View File

@ -1,32 +0,0 @@
#---- get_toolboxitem
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
toolbox_item_id = self._task.args.get('toolbox_item_id', None)
url = server + '/api/v2/canvas/toolboxitem/' + str(toolbox_item_id) + '/'
response = requests.get(url,
verify=False,
auth=(user, password))
result['ansible_facts'] = {var: response.json()}
return result

View File

@ -1,32 +0,0 @@
#---- get_topology
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
topology_id = self._task.args.get('topology_id', None)
url = server + '/api/v2/canvas/topology/' + str(topology_id) + '/'
response = requests.get(url,
verify=False,
auth=(user, password))
result['ansible_facts'] = {var: response.json()}
return result

View File

@ -1,32 +0,0 @@
#---- get_topologyinventory
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
topology_inventory_id = self._task.args.get('topology_inventory_id', None)
url = server + '/api/v2/canvas/topologyinventory/' + str(topology_inventory_id) + '/'
response = requests.get(url,
verify=False,
auth=(user, password))
result['ansible_facts'] = {var: response.json()}
return result

View File

@ -1,57 +0,0 @@
#---- list_device
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
device_id = self._task.args.get('device_id', None)
topology = self._task.args.get('topology', None)
name = self._task.args.get('name', None)
x = self._task.args.get('x', None)
y = self._task.args.get('y', None)
id = self._task.args.get('id', None)
device_type = self._task.args.get('device_type', None)
interface_id_seq = self._task.args.get('interface_id_seq', None)
process_id_seq = self._task.args.get('process_id_seq', None)
host_id = self._task.args.get('host_id', None)
filter_data = dict(device_id=device_id,
topology=topology,
name=name,
x=x,
y=y,
id=id,
device_type=device_type,
interface_id_seq=interface_id_seq,
process_id_seq=process_id_seq,
host_id=host_id,
)
filter_data = {x: y for x, y in filter_data.iteritems() if y is not None}
url = '/api/v2/canvas/device/'
results = []
while url is not None:
url = server + url
data = requests.get(url, verify=False, auth=(user, password), params=filter_data).json()
results.extend(data.get('results', []))
url = data.get('next', None)
result['ansible_facts'] = {var: results}
return result

View File

@ -1,57 +0,0 @@
#---- list_group
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
group_id = self._task.args.get('group_id', None)
id = self._task.args.get('id', None)
name = self._task.args.get('name', None)
x1 = self._task.args.get('x1', None)
y1 = self._task.args.get('y1', None)
x2 = self._task.args.get('x2', None)
y2 = self._task.args.get('y2', None)
topology = self._task.args.get('topology', None)
group_type = self._task.args.get('group_type', None)
inventory_group_id = self._task.args.get('inventory_group_id', None)
filter_data = dict(group_id=group_id,
id=id,
name=name,
x1=x1,
y1=y1,
x2=x2,
y2=y2,
topology=topology,
group_type=group_type,
inventory_group_id=inventory_group_id,
)
filter_data = {x: y for x, y in filter_data.iteritems() if y is not None}
url = '/api/v2/canvas/group/'
results = []
while url is not None:
url = server + url
data = requests.get(url, verify=False, auth=(user, password), params=filter_data).json()
results.extend(data.get('results', []))
url = data.get('next', None)
result['ansible_facts'] = {var: results}
return result

View File

@ -1,43 +0,0 @@
#---- list_groupdevice
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
group_device_id = self._task.args.get('group_device_id', None)
group = self._task.args.get('group', None)
device = self._task.args.get('device', None)
filter_data = dict(group_device_id=group_device_id,
group=group,
device=device,
)
filter_data = {x: y for x, y in filter_data.iteritems() if y is not None}
url = '/api/v2/canvas/groupdevice/'
results = []
while url is not None:
url = server + url
data = requests.get(url, verify=False, auth=(user, password), params=filter_data).json()
results.extend(data.get('results', []))
url = data.get('next', None)
result['ansible_facts'] = {var: results}
return result

View File

@ -1,45 +0,0 @@
#---- list_interface
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
interface_id = self._task.args.get('interface_id', None)
device = self._task.args.get('device', None)
name = self._task.args.get('name', None)
id = self._task.args.get('id', None)
filter_data = dict(interface_id=interface_id,
device=device,
name=name,
id=id,
)
filter_data = {x: y for x, y in filter_data.iteritems() if y is not None}
url = '/api/v2/canvas/interface/'
results = []
while url is not None:
url = server + url
data = requests.get(url, verify=False, auth=(user, password), params=filter_data).json()
results.extend(data.get('results', []))
url = data.get('next', None)
result['ansible_facts'] = {var: results}
return result

View File

@ -1,51 +0,0 @@
#---- list_link
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
link_id = self._task.args.get('link_id', None)
from_device = self._task.args.get('from_device', None)
to_device = self._task.args.get('to_device', None)
from_interface = self._task.args.get('from_interface', None)
to_interface = self._task.args.get('to_interface', None)
id = self._task.args.get('id', None)
name = self._task.args.get('name', None)
filter_data = dict(link_id=link_id,
from_device=from_device,
to_device=to_device,
from_interface=from_interface,
to_interface=to_interface,
id=id,
name=name,
)
filter_data = {x: y for x, y in filter_data.iteritems() if y is not None}
url = '/api/v2/canvas/link/'
results = []
while url is not None:
url = server + url
data = requests.get(url, verify=False, auth=(user, password), params=filter_data).json()
results.extend(data.get('results', []))
url = data.get('next', None)
result['ansible_facts'] = {var: results}
return result

View File

@ -1,47 +0,0 @@
#---- list_process
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
process_id = self._task.args.get('process_id', None)
device = self._task.args.get('device', None)
name = self._task.args.get('name', None)
process_type = self._task.args.get('process_type', None)
id = self._task.args.get('id', None)
filter_data = dict(process_id=process_id,
device=device,
name=name,
process_type=process_type,
id=id,
)
filter_data = {x: y for x, y in filter_data.iteritems() if y is not None}
url = '/api/v2/canvas/process/'
results = []
while url is not None:
url = server + url
data = requests.get(url, verify=False, auth=(user, password), params=filter_data).json()
results.extend(data.get('results', []))
url = data.get('next', None)
result['ansible_facts'] = {var: results}
return result

View File

@ -1,47 +0,0 @@
#---- list_stream
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
stream_id = self._task.args.get('stream_id', None)
from_device = self._task.args.get('from_device', None)
to_device = self._task.args.get('to_device', None)
label = self._task.args.get('label', None)
id = self._task.args.get('id', None)
filter_data = dict(stream_id=stream_id,
from_device=from_device,
to_device=to_device,
label=label,
id=id,
)
filter_data = {x: y for x, y in filter_data.iteritems() if y is not None}
url = '/api/v2/canvas/stream/'
results = []
while url is not None:
url = server + url
data = requests.get(url, verify=False, auth=(user, password), params=filter_data).json()
results.extend(data.get('results', []))
url = data.get('next', None)
result['ansible_facts'] = {var: results}
return result

View File

@ -1,41 +0,0 @@
#---- list_toolbox
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
toolbox_id = self._task.args.get('toolbox_id', None)
name = self._task.args.get('name', None)
filter_data = dict(toolbox_id=toolbox_id,
name=name,
)
filter_data = {x: y for x, y in filter_data.iteritems() if y is not None}
url = '/api/v2/canvas/toolbox/'
results = []
while url is not None:
url = server + url
data = requests.get(url, verify=False, auth=(user, password), params=filter_data).json()
results.extend(data.get('results', []))
url = data.get('next', None)
result['ansible_facts'] = {var: results}
return result

View File

@ -1,43 +0,0 @@
#---- list_toolboxitem
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
toolbox_item_id = self._task.args.get('toolbox_item_id', None)
toolbox = self._task.args.get('toolbox', None)
data = self._task.args.get('data', None)
filter_data = dict(toolbox_item_id=toolbox_item_id,
toolbox=toolbox,
data=data,
)
filter_data = {x: y for x, y in filter_data.iteritems() if y is not None}
url = '/api/v2/canvas/toolboxitem/'
results = []
while url is not None:
url = server + url
data = requests.get(url, verify=False, auth=(user, password), params=filter_data).json()
results.extend(data.get('results', []))
url = data.get('next', None)
result['ansible_facts'] = {var: results}
return result

View File

@ -1,55 +0,0 @@
#---- list_topology
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
topology_id = self._task.args.get('topology_id', None)
name = self._task.args.get('name', None)
scale = self._task.args.get('scale', None)
panX = self._task.args.get('panX', None)
panY = self._task.args.get('panY', None)
device_id_seq = self._task.args.get('device_id_seq', None)
link_id_seq = self._task.args.get('link_id_seq', None)
group_id_seq = self._task.args.get('group_id_seq', None)
stream_id_seq = self._task.args.get('stream_id_seq', None)
filter_data = dict(topology_id=topology_id,
name=name,
scale=scale,
panX=panX,
panY=panY,
device_id_seq=device_id_seq,
link_id_seq=link_id_seq,
group_id_seq=group_id_seq,
stream_id_seq=stream_id_seq,
)
filter_data = {x: y for x, y in filter_data.iteritems() if y is not None}
url = '/api/v2/canvas/topology/'
results = []
while url is not None:
url = server + url
data = requests.get(url, verify=False, auth=(user, password), params=filter_data).json()
results.extend(data.get('results', []))
url = data.get('next', None)
result['ansible_facts'] = {var: results}
return result

View File

@ -1,43 +0,0 @@
#---- list_topologyinventory
from ansible.plugins.action import ActionBase
import requests
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
topology_inventory_id = self._task.args.get('topology_inventory_id', None)
topology = self._task.args.get('topology', None)
inventory_id = self._task.args.get('inventory_id', None)
filter_data = dict(topology_inventory_id=topology_inventory_id,
topology=topology,
inventory_id=inventory_id,
)
filter_data = {x: y for x, y in filter_data.iteritems() if y is not None}
url = '/api/v2/canvas/topologyinventory/'
results = []
while url is not None:
url = server + url
data = requests.get(url, verify=False, auth=(user, password), params=filter_data).json()
results.extend(data.get('results', []))
url = data.get('next', None)
result['ansible_facts'] = {var: results}
return result

View File

@ -1,56 +0,0 @@
#---- update_device
from ansible.plugins.action import ActionBase
import requests
import json
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
device_id = self._task.args.get('device_id', None)
topology = self._task.args.get('topology', None)
name = self._task.args.get('name', None)
x = self._task.args.get('x', None)
y = self._task.args.get('y', None)
id = self._task.args.get('id', None)
device_type = self._task.args.get('device_type', None)
interface_id_seq = self._task.args.get('interface_id_seq', None)
process_id_seq = self._task.args.get('process_id_seq', None)
host_id = self._task.args.get('host_id', None)
url = server + '/api/v2/canvas/device/' + str(device_id) + '/'
headers = {'content-type': 'application/json'}
data = dict(topology=topology,
name=name,
x=x,
y=y,
id=id,
device_type=device_type,
interface_id_seq=interface_id_seq,
process_id_seq=process_id_seq,
host_id=host_id,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(url,
data=json.dumps(data),
verify=False,
auth=(user, password),
headers=headers)
result['ansible_facts'] = {var: response.json()}
return result

View File

@ -1,56 +0,0 @@
#---- update_group
from ansible.plugins.action import ActionBase
import requests
import json
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
group_id = self._task.args.get('group_id', None)
id = self._task.args.get('id', None)
name = self._task.args.get('name', None)
x1 = self._task.args.get('x1', None)
y1 = self._task.args.get('y1', None)
x2 = self._task.args.get('x2', None)
y2 = self._task.args.get('y2', None)
topology = self._task.args.get('topology', None)
group_type = self._task.args.get('group_type', None)
inventory_group_id = self._task.args.get('inventory_group_id', None)
url = server + '/api/v2/canvas/group/' + str(group_id) + '/'
headers = {'content-type': 'application/json'}
data = dict(id=id,
name=name,
x1=x1,
y1=y1,
x2=x2,
y2=y2,
topology=topology,
group_type=group_type,
inventory_group_id=inventory_group_id,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(url,
data=json.dumps(data),
verify=False,
auth=(user, password),
headers=headers)
result['ansible_facts'] = {var: response.json()}
return result

View File

@ -1,42 +0,0 @@
#---- update_groupdevice
from ansible.plugins.action import ActionBase
import requests
import json
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
group_device_id = self._task.args.get('group_device_id', None)
group = self._task.args.get('group', None)
device = self._task.args.get('device', None)
url = server + '/api/v2/canvas/groupdevice/' + str(group_device_id) + '/'
headers = {'content-type': 'application/json'}
data = dict(group=group,
device=device,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(url,
data=json.dumps(data),
verify=False,
auth=(user, password),
headers=headers)
result['ansible_facts'] = {var: response.json()}
return result

View File

@ -1,44 +0,0 @@
#---- update_interface
from ansible.plugins.action import ActionBase
import requests
import json
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
interface_id = self._task.args.get('interface_id', None)
device = self._task.args.get('device', None)
name = self._task.args.get('name', None)
id = self._task.args.get('id', None)
url = server + '/api/v2/canvas/interface/' + str(interface_id) + '/'
headers = {'content-type': 'application/json'}
data = dict(device=device,
name=name,
id=id,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(url,
data=json.dumps(data),
verify=False,
auth=(user, password),
headers=headers)
result['ansible_facts'] = {var: response.json()}
return result

View File

@ -1,50 +0,0 @@
#---- update_link
from ansible.plugins.action import ActionBase
import requests
import json
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
link_id = self._task.args.get('link_id', None)
from_device = self._task.args.get('from_device', None)
to_device = self._task.args.get('to_device', None)
from_interface = self._task.args.get('from_interface', None)
to_interface = self._task.args.get('to_interface', None)
id = self._task.args.get('id', None)
name = self._task.args.get('name', None)
url = server + '/api/v2/canvas/link/' + str(link_id) + '/'
headers = {'content-type': 'application/json'}
data = dict(from_device=from_device,
to_device=to_device,
from_interface=from_interface,
to_interface=to_interface,
id=id,
name=name,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(url,
data=json.dumps(data),
verify=False,
auth=(user, password),
headers=headers)
result['ansible_facts'] = {var: response.json()}
return result

View File

@ -1,46 +0,0 @@
#---- update_process
from ansible.plugins.action import ActionBase
import requests
import json
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
process_id = self._task.args.get('process_id', None)
device = self._task.args.get('device', None)
name = self._task.args.get('name', None)
process_type = self._task.args.get('process_type', None)
id = self._task.args.get('id', None)
url = server + '/api/v2/canvas/process/' + str(process_id) + '/'
headers = {'content-type': 'application/json'}
data = dict(device=device,
name=name,
process_type=process_type,
id=id,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(url,
data=json.dumps(data),
verify=False,
auth=(user, password),
headers=headers)
result['ansible_facts'] = {var: response.json()}
return result

View File

@ -1,46 +0,0 @@
#---- update_stream
from ansible.plugins.action import ActionBase
import requests
import json
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
stream_id = self._task.args.get('stream_id', None)
from_device = self._task.args.get('from_device', None)
to_device = self._task.args.get('to_device', None)
label = self._task.args.get('label', None)
id = self._task.args.get('id', None)
url = server + '/api/v2/canvas/stream/' + str(stream_id) + '/'
headers = {'content-type': 'application/json'}
data = dict(from_device=from_device,
to_device=to_device,
label=label,
id=id,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(url,
data=json.dumps(data),
verify=False,
auth=(user, password),
headers=headers)
result['ansible_facts'] = {var: response.json()}
return result

View File

@ -1,40 +0,0 @@
#---- update_toolbox
from ansible.plugins.action import ActionBase
import requests
import json
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
toolbox_id = self._task.args.get('toolbox_id', None)
name = self._task.args.get('name', None)
url = server + '/api/v2/canvas/toolbox/' + str(toolbox_id) + '/'
headers = {'content-type': 'application/json'}
data = dict(name=name,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(url,
data=json.dumps(data),
verify=False,
auth=(user, password),
headers=headers)
result['ansible_facts'] = {var: response.json()}
return result

View File

@ -1,42 +0,0 @@
#---- update_toolboxitem
from ansible.plugins.action import ActionBase
import requests
import json
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
toolbox_item_id = self._task.args.get('toolbox_item_id', None)
toolbox = self._task.args.get('toolbox', None)
data = self._task.args.get('data', None)
url = server + '/api/v2/canvas/toolboxitem/' + str(toolbox_item_id) + '/'
headers = {'content-type': 'application/json'}
data = dict(toolbox=toolbox,
data=data,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(url,
data=json.dumps(data),
verify=False,
auth=(user, password),
headers=headers)
result['ansible_facts'] = {var: response.json()}
return result

View File

@ -1,54 +0,0 @@
#---- update_topology
from ansible.plugins.action import ActionBase
import requests
import json
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
topology_id = self._task.args.get('topology_id', None)
name = self._task.args.get('name', None)
scale = self._task.args.get('scale', None)
panX = self._task.args.get('panX', None)
panY = self._task.args.get('panY', None)
device_id_seq = self._task.args.get('device_id_seq', None)
link_id_seq = self._task.args.get('link_id_seq', None)
group_id_seq = self._task.args.get('group_id_seq', None)
stream_id_seq = self._task.args.get('stream_id_seq', None)
url = server + '/api/v2/canvas/topology/' + str(topology_id) + '/'
headers = {'content-type': 'application/json'}
data = dict(name=name,
scale=scale,
panX=panX,
panY=panY,
device_id_seq=device_id_seq,
link_id_seq=link_id_seq,
group_id_seq=group_id_seq,
stream_id_seq=stream_id_seq,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(url,
data=json.dumps(data),
verify=False,
auth=(user, password),
headers=headers)
result['ansible_facts'] = {var: response.json()}
return result

View File

@ -1,42 +0,0 @@
#---- update_topologyinventory
from ansible.plugins.action import ActionBase
import requests
import json
class ActionModule(ActionBase):
BYPASS_HOST_LOOP = True
def run(self, tmp=None, task_vars=None):
if task_vars is None:
task_vars = dict()
result = super(ActionModule, self).run(tmp, task_vars)
server = self._task.args.get('server',
"{0}:{1}".format(self._play_context.remote_addr,
self._play_context.port))
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
var = self._task.args.get('var', None)
topology_inventory_id = self._task.args.get('topology_inventory_id', None)
topology = self._task.args.get('topology', None)
inventory_id = self._task.args.get('inventory_id', None)
url = server + '/api/v2/canvas/topologyinventory/' + str(topology_inventory_id) + '/'
headers = {'content-type': 'application/json'}
data = dict(topology=topology,
inventory_id=inventory_id,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(url,
data=json.dumps(data),
verify=False,
auth=(user, password),
headers=headers)
result['ansible_facts'] = {var: response.json()}
return result

View File

@ -1,251 +0,0 @@
from django.contrib import admin
from awx.network_ui.models import Device
from awx.network_ui.models import Link
from awx.network_ui.models import Topology
from awx.network_ui.models import Client
from awx.network_ui.models import TopologyHistory
from awx.network_ui.models import MessageType
from awx.network_ui.models import Interface
from awx.network_ui.models import Group
from awx.network_ui.models import GroupDevice
from awx.network_ui.models import DataBinding
from awx.network_ui.models import DataType
from awx.network_ui.models import DataSheet
from awx.network_ui.models import Stream
from awx.network_ui.models import Process
from awx.network_ui.models import Toolbox
from awx.network_ui.models import ToolboxItem
from awx.network_ui.models import FSMTrace
from awx.network_ui.models import TopologyInventory
from awx.network_ui.models import EventTrace
from awx.network_ui.models import Coverage
from awx.network_ui.models import TopologySnapshot
from awx.network_ui.models import TestCase
from awx.network_ui.models import Result
from awx.network_ui.models import CodeUnderTest
from awx.network_ui.models import TestResult
class DeviceAdmin(admin.ModelAdmin):
fields = ('topology', 'name', 'x', 'y', 'id', 'device_type', 'interface_id_seq', 'process_id_seq', 'host_id',)
raw_id_fields = ('topology',)
admin.site.register(Device, DeviceAdmin)
class LinkAdmin(admin.ModelAdmin):
fields = ('from_device', 'to_device', 'from_interface', 'to_interface', 'id', 'name',)
raw_id_fields = ('from_device', 'to_device', 'from_interface', 'to_interface',)
admin.site.register(Link, LinkAdmin)
class TopologyAdmin(admin.ModelAdmin):
fields = ('name', 'scale', 'panX', 'panY', 'device_id_seq', 'link_id_seq', 'group_id_seq', 'stream_id_seq',)
raw_id_fields = ()
admin.site.register(Topology, TopologyAdmin)
class ClientAdmin(admin.ModelAdmin):
fields = ()
raw_id_fields = ()
admin.site.register(Client, ClientAdmin)
class TopologyHistoryAdmin(admin.ModelAdmin):
fields = ('topology', 'client', 'message_type', 'message_id', 'message_data', 'undone',)
raw_id_fields = ('topology', 'client', 'message_type',)
admin.site.register(TopologyHistory, TopologyHistoryAdmin)
class MessageTypeAdmin(admin.ModelAdmin):
fields = ('name',)
raw_id_fields = ()
admin.site.register(MessageType, MessageTypeAdmin)
class InterfaceAdmin(admin.ModelAdmin):
fields = ('device', 'name', 'id',)
raw_id_fields = ('device',)
admin.site.register(Interface, InterfaceAdmin)
class GroupAdmin(admin.ModelAdmin):
fields = ('id', 'name', 'x1', 'y1', 'x2', 'y2', 'topology', 'group_type', 'inventory_group_id',)
raw_id_fields = ('topology',)
admin.site.register(Group, GroupAdmin)
class GroupDeviceAdmin(admin.ModelAdmin):
fields = ('group', 'device',)
raw_id_fields = ('group', 'device',)
admin.site.register(GroupDevice, GroupDeviceAdmin)
class DataBindingAdmin(admin.ModelAdmin):
fields = ('column', 'row', 'table', 'primary_key_id', 'field', 'data_type', 'sheet',)
raw_id_fields = ('data_type', 'sheet',)
admin.site.register(DataBinding, DataBindingAdmin)
class DataTypeAdmin(admin.ModelAdmin):
fields = ('type_name',)
raw_id_fields = ()
admin.site.register(DataType, DataTypeAdmin)
class DataSheetAdmin(admin.ModelAdmin):
fields = ('name', 'topology', 'client',)
raw_id_fields = ('topology', 'client',)
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',)
admin.site.register(Stream, StreamAdmin)
class ProcessAdmin(admin.ModelAdmin):
fields = ('device', 'name', 'process_type', 'id',)
raw_id_fields = ('device',)
admin.site.register(Process, ProcessAdmin)
class ToolboxAdmin(admin.ModelAdmin):
fields = ('name',)
raw_id_fields = ()
admin.site.register(Toolbox, ToolboxAdmin)
class ToolboxItemAdmin(admin.ModelAdmin):
fields = ('toolbox', 'data',)
raw_id_fields = ('toolbox',)
admin.site.register(ToolboxItem, ToolboxItemAdmin)
class FSMTraceAdmin(admin.ModelAdmin):
fields = ('fsm_name', 'from_state', 'to_state', 'message_type', 'client', 'trace_session_id', 'order',)
raw_id_fields = ('client',)
admin.site.register(FSMTrace, FSMTraceAdmin)
class TopologyInventoryAdmin(admin.ModelAdmin):
fields = ('topology', 'inventory_id',)
raw_id_fields = ('topology',)
admin.site.register(TopologyInventory, TopologyInventoryAdmin)
class EventTraceAdmin(admin.ModelAdmin):
fields = ('client', 'trace_session_id', 'event_data', 'message_id',)
raw_id_fields = ('client',)
admin.site.register(EventTrace, EventTraceAdmin)
class CoverageAdmin(admin.ModelAdmin):
fields = ('coverage_data', 'test_result',)
raw_id_fields = ('test_result',)
admin.site.register(Coverage, CoverageAdmin)
class TopologySnapshotAdmin(admin.ModelAdmin):
fields = ('client', 'topology_id', 'trace_session_id', 'snapshot_data', 'order',)
raw_id_fields = ('client', 'snapshot_data',)
admin.site.register(TopologySnapshot, TopologySnapshotAdmin)
class TestCaseAdmin(admin.ModelAdmin):
fields = ('name', 'test_case_data',)
raw_id_fields = ('name',)
admin.site.register(TestCase, TestCaseAdmin)
class ResultAdmin(admin.ModelAdmin):
fields = ('name',)
raw_id_fields = ()
admin.site.register(Result, ResultAdmin)
class CodeUnderTestAdmin(admin.ModelAdmin):
fields = ('version_x', 'version_y', 'version_z', 'commits_since', 'commit_hash',)
raw_id_fields = ('code_under_test_id',)
admin.site.register(CodeUnderTest, CodeUnderTestAdmin)
class TestResultAdmin(admin.ModelAdmin):
fields = ('test_case', 'result', 'code_under_test', 'time', 'id', 'client',)
raw_id_fields = ('test_case', 'result', 'code_under_test', 'client',)
admin.site.register(TestResult, TestResultAdmin)

View File

@ -1,3 +0,0 @@
API client for the networking visualization.

View File

@ -1,11 +0,0 @@
class _Settings(object):
def __init__(self):
self.SERVER = 'https://meganuke:8043'
self.SSL_VERIFY = False
self.user = None
self.password = None
settings = _Settings()

View File

@ -1,94 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Usage:
networking_visualization_client.py [options] (create|list|get|update|delete) [device|topology|interface|link] [<filter>...]
Options:
-h, --help Show this page
--user=<u> User
--password-file=<f>|-p=<f> Password file
--debug Show debug logging
--verbose Show verbose logging
"""
from docopt import docopt
import logging
import sys
from getpass import getpass
from conf import settings
import json
import os
import v2_api_client
logger = logging.getLogger('networking_visualization_client')
def main(args=None):
try:
if args is None:
args = sys.argv[1:]
parsed_args = docopt(__doc__, args)
if parsed_args['--debug']:
logging.basicConfig(level=logging.DEBUG)
elif parsed_args['--verbose']:
logging.basicConfig(level=logging.INFO)
else:
logging.basicConfig(level=logging.WARNING)
settings.user = parsed_args['--user']
if parsed_args['--password-file'] and os.path.exists(os.path.abspath(parsed_args['--password-file'])):
with open(os.path.abspath(parsed_args['--password-file'])) as f:
settings.password = f.read().strip()
else:
settings.password = getpass()
query_filter = {}
if parsed_args['<filter>']:
for key_value in parsed_args['<filter>']:
if "=" in key_value:
key, _, value = key_value.partition("=")
if value.lower() in ["true", "yes"]:
query_filter[key] = True
elif value.lower() in ["false", "no"]:
query_filter[key] = False
else:
try:
query_filter[key] = int(value)
except ValueError:
try:
query_filter[key] = float(value)
except ValueError:
query_filter[key] = value
else:
raise Exception("Filters should be in the form of 'key=value'")
operation = ('get' if parsed_args['get'] else
'list' if parsed_args['list'] else
'create' if parsed_args['create'] else
'delete' if parsed_args['delete'] else
'update' if parsed_args['update'] else None)
if (parsed_args['topology']):
result = v2_api_client.__dict__[operation + "_topology"](**query_filter)
elif (parsed_args['device']):
result = v2_api_client.__dict__[operation + "_device"](**query_filter)
elif (parsed_args['interface']):
result = v2_api_client.__dict__[operation + "_interface"](**query_filter)
elif (parsed_args['link']):
result = v2_api_client.__dict__[operation + "_link"](**query_filter)
if isinstance(result, dict) or isinstance(result, list):
print json.dumps(result, sort_keys=True, indent=4)
except BaseException, e:
print ("Error: {0}".format(e))
raise
return 1
return 0
if __name__ == '__main__':
sys.exit(main(sys.argv[1:]))

View File

@ -1,3 +0,0 @@
docopt
requests
pyyaml

View File

@ -1,27 +0,0 @@
import requests
from conf import settings
def get_url():
return settings.SERVER
def get_auth():
return (settings.user, settings.password)
def get_verify():
return settings.SSL_VERIFY
def unpaginate(server, url, verify, auth, filter_data):
results = []
while url is not None:
url = "{0}{1}".format(server, url)
data = requests.get(url, verify=verify, auth=auth, params=filter_data).json()
results.extend(data.get('results', []))
url = data.get('next', None)
return results

View File

@ -1,588 +0,0 @@
import requests
import util
import json
from collections import namedtuple
Device = namedtuple('Device', ['device_id',
'topology',
'name',
'x',
'y',
'id',
'device_type',
'interface_id_seq',
'process_id_seq',
'host_id',
])
Link = namedtuple('Link', ['link_id',
'from_device',
'to_device',
'from_interface',
'to_interface',
'id',
'name',
])
Topology = namedtuple('Topology', ['topology_id',
'name',
'scale',
'panX',
'panY',
'device_id_seq',
'link_id_seq',
'group_id_seq',
'stream_id_seq',
])
Interface = namedtuple('Interface', ['interface_id',
'device',
'name',
'id',
])
Group = namedtuple('Group', ['group_id',
'id',
'name',
'x1',
'y1',
'x2',
'y2',
'topology',
'group_type',
'inventory_group_id',
])
GroupDevice = namedtuple('GroupDevice', ['group_device_id',
'group',
'device',
])
Stream = namedtuple('Stream', ['stream_id',
'from_device',
'to_device',
'label',
'id',
])
Process = namedtuple('Process', ['process_id',
'device',
'name',
'process_type',
'id',
])
Toolbox = namedtuple('Toolbox', ['toolbox_id',
'name',
])
ToolboxItem = namedtuple('ToolboxItem', ['toolbox_item_id',
'toolbox',
'data',
])
TopologyInventory = namedtuple('TopologyInventory', ['topology_inventory_id',
'topology',
'inventory_id',
])
def list_device(**kwargs):
response = util.unpaginate(util.get_url(), '/network_ui/api/v1/device/', util.get_verify(), util.get_auth(), kwargs)
return response
def get_device(device_id):
response = requests.get(util.get_url() + "/network_ui/api/v1/device/" + str(device_id), verify=util.get_verify(), auth=util.get_auth())
return response.json()
def create_device(topology, name, x, y, id, device_type, interface_id_seq=0, process_id_seq=0, host_id=0,):
headers = {'content-type': 'application/json'}
response = requests.post(util.get_url() + "/network_ui/api/v1/device/", data=json.dumps(dict(topology=topology,
name=name,
x=x,
y=y,
id=id,
device_type=device_type,
interface_id_seq=interface_id_seq,
process_id_seq=process_id_seq,
host_id=host_id,
)),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response.json()
def update_device(device_id, topology=None, name=None, x=None, y=None, id=None, device_type=None, interface_id_seq=None, process_id_seq=None, host_id=None,):
headers = {'content-type': 'application/json'}
data = dict(topology=topology,
name=name,
x=x,
y=y,
id=id,
device_type=device_type,
interface_id_seq=interface_id_seq,
process_id_seq=process_id_seq,
host_id=host_id,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(util.get_url() + "/network_ui/api/v1/device/" + str(device_id) + "/",
data=json.dumps(data),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response
def delete_device(device_id):
response = requests.delete(util.get_url() + "/network_ui/api/v1/device/" + str(device_id), verify=util.get_verify(), auth=util.get_auth())
return response
def list_link(**kwargs):
response = util.unpaginate(util.get_url(), '/network_ui/api/v1/link/', util.get_verify(), util.get_auth(), kwargs)
return response
def get_link(link_id):
response = requests.get(util.get_url() + "/network_ui/api/v1/link/" + str(link_id), verify=util.get_verify(), auth=util.get_auth())
return response.json()
def create_link(from_device, to_device, from_interface, to_interface, id, name,):
headers = {'content-type': 'application/json'}
response = requests.post(util.get_url() + "/network_ui/api/v1/link/", data=json.dumps(dict(from_device=from_device,
to_device=to_device,
from_interface=from_interface,
to_interface=to_interface,
id=id,
name=name,
)),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response.json()
def update_link(link_id, from_device=None, to_device=None, from_interface=None, to_interface=None, id=None, name=None,):
headers = {'content-type': 'application/json'}
data = dict(from_device=from_device,
to_device=to_device,
from_interface=from_interface,
to_interface=to_interface,
id=id,
name=name,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(util.get_url() + "/network_ui/api/v1/link/" + str(link_id) + "/",
data=json.dumps(data),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response
def delete_link(link_id):
response = requests.delete(util.get_url() + "/network_ui/api/v1/link/" + str(link_id), verify=util.get_verify(), auth=util.get_auth())
return response
def list_topology(**kwargs):
response = util.unpaginate(util.get_url(), '/network_ui/api/v1/topology/', util.get_verify(), util.get_auth(), kwargs)
return response
def get_topology(topology_id):
response = requests.get(util.get_url() + "/network_ui/api/v1/topology/" + str(topology_id), verify=util.get_verify(), auth=util.get_auth())
return response.json()
def create_topology(name, scale, panX, panY, device_id_seq=0, link_id_seq=0, group_id_seq=0, stream_id_seq=0,):
headers = {'content-type': 'application/json'}
response = requests.post(util.get_url() + "/network_ui/api/v1/topology/", data=json.dumps(dict(name=name,
scale=scale,
panX=panX,
panY=panY,
device_id_seq=device_id_seq,
link_id_seq=link_id_seq,
group_id_seq=group_id_seq,
stream_id_seq=stream_id_seq,
)),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response.json()
def update_topology(topology_id, name=None, scale=None, panX=None, panY=None, device_id_seq=None, link_id_seq=None, group_id_seq=None, stream_id_seq=None,):
headers = {'content-type': 'application/json'}
data = dict(name=name,
scale=scale,
panX=panX,
panY=panY,
device_id_seq=device_id_seq,
link_id_seq=link_id_seq,
group_id_seq=group_id_seq,
stream_id_seq=stream_id_seq,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(util.get_url() + "/network_ui/api/v1/topology/" + str(topology_id) + "/",
data=json.dumps(data),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response
def delete_topology(topology_id):
response = requests.delete(util.get_url() + "/network_ui/api/v1/topology/" + str(topology_id), verify=util.get_verify(), auth=util.get_auth())
return response
def list_interface(**kwargs):
response = util.unpaginate(util.get_url(), '/network_ui/api/v1/interface/', util.get_verify(), util.get_auth(), kwargs)
return response
def get_interface(interface_id):
response = requests.get(util.get_url() + "/network_ui/api/v1/interface/" + str(interface_id), verify=util.get_verify(), auth=util.get_auth())
return response.json()
def create_interface(device, name, id,):
headers = {'content-type': 'application/json'}
response = requests.post(util.get_url() + "/network_ui/api/v1/interface/", data=json.dumps(dict(device=device,
name=name,
id=id,
)),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response.json()
def update_interface(interface_id, device=None, name=None, id=None,):
headers = {'content-type': 'application/json'}
data = dict(device=device,
name=name,
id=id,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(util.get_url() + "/network_ui/api/v1/interface/" + str(interface_id) + "/",
data=json.dumps(data),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response
def delete_interface(interface_id):
response = requests.delete(util.get_url() + "/network_ui/api/v1/interface/" + str(interface_id), verify=util.get_verify(), auth=util.get_auth())
return response
def list_group(**kwargs):
response = util.unpaginate(util.get_url(), '/network_ui/api/v1/group/', util.get_verify(), util.get_auth(), kwargs)
return response
def get_group(group_id):
response = requests.get(util.get_url() + "/network_ui/api/v1/group/" + str(group_id), verify=util.get_verify(), auth=util.get_auth())
return response.json()
def create_group(id, name, x1, y1, x2, y2, topology, group_type, inventory_group_id=0,):
headers = {'content-type': 'application/json'}
response = requests.post(util.get_url() + "/network_ui/api/v1/group/", data=json.dumps(dict(id=id,
name=name,
x1=x1,
y1=y1,
x2=x2,
y2=y2,
topology=topology,
group_type=group_type,
inventory_group_id=inventory_group_id,
)),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response.json()
def update_group(group_id, id=None, name=None, x1=None, y1=None, x2=None, y2=None, topology=None, group_type=None, inventory_group_id=None,):
headers = {'content-type': 'application/json'}
data = dict(id=id,
name=name,
x1=x1,
y1=y1,
x2=x2,
y2=y2,
topology=topology,
group_type=group_type,
inventory_group_id=inventory_group_id,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(util.get_url() + "/network_ui/api/v1/group/" + str(group_id) + "/",
data=json.dumps(data),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response
def delete_group(group_id):
response = requests.delete(util.get_url() + "/network_ui/api/v1/group/" + str(group_id), verify=util.get_verify(), auth=util.get_auth())
return response
def list_groupdevice(**kwargs):
response = util.unpaginate(util.get_url(), '/network_ui/api/v1/groupdevice/', util.get_verify(), util.get_auth(), kwargs)
return response
def get_groupdevice(group_device_id):
response = requests.get(util.get_url() + "/network_ui/api/v1/groupdevice/" + str(group_device_id), verify=util.get_verify(), auth=util.get_auth())
return response.json()
def create_groupdevice(group, device,):
headers = {'content-type': 'application/json'}
response = requests.post(util.get_url() + "/network_ui/api/v1/groupdevice/", data=json.dumps(dict(group=group,
device=device,
)),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response.json()
def update_groupdevice(group_device_id, group=None, device=None,):
headers = {'content-type': 'application/json'}
data = dict(group=group,
device=device,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(util.get_url() + "/network_ui/api/v1/groupdevice/" + str(group_device_id) + "/",
data=json.dumps(data),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response
def delete_groupdevice(group_device_id):
response = requests.delete(util.get_url() + "/network_ui/api/v1/groupdevice/" + str(group_device_id), verify=util.get_verify(), auth=util.get_auth())
return response
def list_stream(**kwargs):
response = util.unpaginate(util.get_url(), '/network_ui/api/v1/stream/', util.get_verify(), util.get_auth(), kwargs)
return response
def get_stream(stream_id):
response = requests.get(util.get_url() + "/network_ui/api/v1/stream/" + str(stream_id), verify=util.get_verify(), auth=util.get_auth())
return response.json()
def create_stream(from_device, to_device, label, id=0,):
headers = {'content-type': 'application/json'}
response = requests.post(util.get_url() + "/network_ui/api/v1/stream/", data=json.dumps(dict(from_device=from_device,
to_device=to_device,
label=label,
id=id,
)),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response.json()
def update_stream(stream_id, from_device=None, to_device=None, label=None, id=None,):
headers = {'content-type': 'application/json'}
data = dict(from_device=from_device,
to_device=to_device,
label=label,
id=id,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(util.get_url() + "/network_ui/api/v1/stream/" + str(stream_id) + "/",
data=json.dumps(data),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response
def delete_stream(stream_id):
response = requests.delete(util.get_url() + "/network_ui/api/v1/stream/" + str(stream_id), verify=util.get_verify(), auth=util.get_auth())
return response
def list_process(**kwargs):
response = util.unpaginate(util.get_url(), '/network_ui/api/v1/process/', util.get_verify(), util.get_auth(), kwargs)
return response
def get_process(process_id):
response = requests.get(util.get_url() + "/network_ui/api/v1/process/" + str(process_id), verify=util.get_verify(), auth=util.get_auth())
return response.json()
def create_process(device, name, process_type, id=0,):
headers = {'content-type': 'application/json'}
response = requests.post(util.get_url() + "/network_ui/api/v1/process/", data=json.dumps(dict(device=device,
name=name,
process_type=process_type,
id=id,
)),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response.json()
def update_process(process_id, device=None, name=None, process_type=None, id=None,):
headers = {'content-type': 'application/json'}
data = dict(device=device,
name=name,
process_type=process_type,
id=id,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(util.get_url() + "/network_ui/api/v1/process/" + str(process_id) + "/",
data=json.dumps(data),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response
def delete_process(process_id):
response = requests.delete(util.get_url() + "/network_ui/api/v1/process/" + str(process_id), verify=util.get_verify(), auth=util.get_auth())
return response
def list_toolbox(**kwargs):
response = util.unpaginate(util.get_url(), '/network_ui/api/v1/toolbox/', util.get_verify(), util.get_auth(), kwargs)
return response
def get_toolbox(toolbox_id):
response = requests.get(util.get_url() + "/network_ui/api/v1/toolbox/" + str(toolbox_id), verify=util.get_verify(), auth=util.get_auth())
return response.json()
def create_toolbox(name,):
headers = {'content-type': 'application/json'}
response = requests.post(util.get_url() + "/network_ui/api/v1/toolbox/", data=json.dumps(dict(name=name,
)),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response.json()
def update_toolbox(toolbox_id, name=None,):
headers = {'content-type': 'application/json'}
data = dict(name=name,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(util.get_url() + "/network_ui/api/v1/toolbox/" + str(toolbox_id) + "/",
data=json.dumps(data),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response
def delete_toolbox(toolbox_id):
response = requests.delete(util.get_url() + "/network_ui/api/v1/toolbox/" + str(toolbox_id), verify=util.get_verify(), auth=util.get_auth())
return response
def list_toolboxitem(**kwargs):
response = util.unpaginate(util.get_url(), '/network_ui/api/v1/toolboxitem/', util.get_verify(), util.get_auth(), kwargs)
return response
def get_toolboxitem(toolbox_item_id):
response = requests.get(util.get_url() + "/network_ui/api/v1/toolboxitem/" + str(toolbox_item_id), verify=util.get_verify(), auth=util.get_auth())
return response.json()
def create_toolboxitem(toolbox, data,):
headers = {'content-type': 'application/json'}
response = requests.post(util.get_url() + "/network_ui/api/v1/toolboxitem/", data=json.dumps(dict(toolbox=toolbox,
data=data,
)),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response.json()
def update_toolboxitem(toolbox_item_id, toolbox=None, data=None,):
headers = {'content-type': 'application/json'}
data = dict(toolbox=toolbox,
data=data,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(util.get_url() + "/network_ui/api/v1/toolboxitem/" + str(toolbox_item_id) + "/",
data=json.dumps(data),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response
def delete_toolboxitem(toolbox_item_id):
response = requests.delete(util.get_url() + "/network_ui/api/v1/toolboxitem/" + str(toolbox_item_id), verify=util.get_verify(), auth=util.get_auth())
return response
def list_topologyinventory(**kwargs):
response = util.unpaginate(util.get_url(), '/network_ui/api/v1/topologyinventory/', util.get_verify(), util.get_auth(), kwargs)
return response
def get_topologyinventory(topology_inventory_id):
response = requests.get(util.get_url() + "/network_ui/api/v1/topologyinventory/" +
str(topology_inventory_id), verify=util.get_verify(), auth=util.get_auth())
return response.json()
def create_topologyinventory(topology, inventory_id,):
headers = {'content-type': 'application/json'}
response = requests.post(util.get_url() + "/network_ui/api/v1/topologyinventory/", data=json.dumps(dict(topology=topology,
inventory_id=inventory_id,
)),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response.json()
def update_topologyinventory(topology_inventory_id, topology=None, inventory_id=None,):
headers = {'content-type': 'application/json'}
data = dict(topology=topology,
inventory_id=inventory_id,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(util.get_url() + "/network_ui/api/v1/topologyinventory/" + str(topology_inventory_id) + "/",
data=json.dumps(data),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response
def delete_topologyinventory(topology_inventory_id):
response = requests.delete(util.get_url() + "/network_ui/api/v1/topologyinventory/" +
str(topology_inventory_id), verify=util.get_verify(), auth=util.get_auth())
return response

View File

@ -1,502 +0,0 @@
import requests
import util
import json
def list_device(**kwargs):
response = util.unpaginate(util.get_url(), '/api/v2/canvas/device/', util.get_verify(), util.get_auth(), kwargs)
return response
def get_device(device_id):
response = requests.get(util.get_url() + "/api/v2/canvas/device/" + str(device_id), verify=util.get_verify(), auth=util.get_auth())
return response.json()
def create_device(topology, name, x, y, id, device_type, interface_id_seq=0, process_id_seq=0, host_id=0,):
headers = {'content-type': 'application/json'}
response = requests.post(util.get_url() + "/api/v2/canvas/device/", data=json.dumps(dict(topology=topology,
name=name,
x=x,
y=y,
id=id,
device_type=device_type,
interface_id_seq=interface_id_seq,
process_id_seq=process_id_seq,
host_id=host_id,
)),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response.json()
def update_device(device_id, topology=None, name=None, x=None, y=None, id=None, device_type=None, interface_id_seq=None, process_id_seq=None, host_id=None,):
headers = {'content-type': 'application/json'}
data = dict(topology=topology,
name=name,
x=x,
y=y,
id=id,
device_type=device_type,
interface_id_seq=interface_id_seq,
process_id_seq=process_id_seq,
host_id=host_id,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(util.get_url() + "/api/v2/canvas/device/" + str(device_id) + "/",
data=json.dumps(data),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response
def delete_device(device_id):
response = requests.delete(util.get_url() + "/api/v2/canvas/device/" + str(device_id), verify=util.get_verify(), auth=util.get_auth())
return response
def list_link(**kwargs):
response = util.unpaginate(util.get_url(), '/api/v2/canvas/link/', util.get_verify(), util.get_auth(), kwargs)
return response
def get_link(link_id):
response = requests.get(util.get_url() + "/api/v2/canvas/link/" + str(link_id), verify=util.get_verify(), auth=util.get_auth())
return response.json()
def create_link(from_device, to_device, from_interface, to_interface, id, name,):
headers = {'content-type': 'application/json'}
response = requests.post(util.get_url() + "/api/v2/canvas/link/", data=json.dumps(dict(from_device=from_device,
to_device=to_device,
from_interface=from_interface,
to_interface=to_interface,
id=id,
name=name,
)),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response.json()
def update_link(link_id, from_device=None, to_device=None, from_interface=None, to_interface=None, id=None, name=None,):
headers = {'content-type': 'application/json'}
data = dict(from_device=from_device,
to_device=to_device,
from_interface=from_interface,
to_interface=to_interface,
id=id,
name=name,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(util.get_url() + "/api/v2/canvas/link/" + str(link_id) + "/",
data=json.dumps(data),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response
def delete_link(link_id):
response = requests.delete(util.get_url() + "/api/v2/canvas/link/" + str(link_id), verify=util.get_verify(), auth=util.get_auth())
return response
def list_topology(**kwargs):
response = util.unpaginate(util.get_url(), '/api/v2/canvas/topology/', util.get_verify(), util.get_auth(), kwargs)
return response
def get_topology(topology_id):
response = requests.get(util.get_url() + "/api/v2/canvas/topology/" + str(topology_id), verify=util.get_verify(), auth=util.get_auth())
return response.json()
def create_topology(name, scale, panX, panY, device_id_seq=0, link_id_seq=0, group_id_seq=0, stream_id_seq=0,):
headers = {'content-type': 'application/json'}
response = requests.post(util.get_url() + "/api/v2/canvas/topology/", data=json.dumps(dict(name=name,
scale=scale,
panX=panX,
panY=panY,
device_id_seq=device_id_seq,
link_id_seq=link_id_seq,
group_id_seq=group_id_seq,
stream_id_seq=stream_id_seq,
)),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response.json()
def update_topology(topology_id, name=None, scale=None, panX=None, panY=None, device_id_seq=None, link_id_seq=None, group_id_seq=None, stream_id_seq=None,):
headers = {'content-type': 'application/json'}
data = dict(name=name,
scale=scale,
panX=panX,
panY=panY,
device_id_seq=device_id_seq,
link_id_seq=link_id_seq,
group_id_seq=group_id_seq,
stream_id_seq=stream_id_seq,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(util.get_url() + "/api/v2/canvas/topology/" + str(topology_id) + "/",
data=json.dumps(data),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response
def delete_topology(topology_id):
response = requests.delete(util.get_url() + "/api/v2/canvas/topology/" + str(topology_id), verify=util.get_verify(), auth=util.get_auth())
return response
def list_interface(**kwargs):
response = util.unpaginate(util.get_url(), '/api/v2/canvas/interface/', util.get_verify(), util.get_auth(), kwargs)
return response
def get_interface(interface_id):
response = requests.get(util.get_url() + "/api/v2/canvas/interface/" + str(interface_id), verify=util.get_verify(), auth=util.get_auth())
return response.json()
def create_interface(device, name, id,):
headers = {'content-type': 'application/json'}
response = requests.post(util.get_url() + "/api/v2/canvas/interface/", data=json.dumps(dict(device=device,
name=name,
id=id,
)),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response.json()
def update_interface(interface_id, device=None, name=None, id=None,):
headers = {'content-type': 'application/json'}
data = dict(device=device,
name=name,
id=id,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(util.get_url() + "/api/v2/canvas/interface/" + str(interface_id) + "/",
data=json.dumps(data),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response
def delete_interface(interface_id):
response = requests.delete(util.get_url() + "/api/v2/canvas/interface/" + str(interface_id), verify=util.get_verify(), auth=util.get_auth())
return response
def list_group(**kwargs):
response = util.unpaginate(util.get_url(), '/api/v2/canvas/group/', util.get_verify(), util.get_auth(), kwargs)
return response
def get_group(group_id):
response = requests.get(util.get_url() + "/api/v2/canvas/group/" + str(group_id), verify=util.get_verify(), auth=util.get_auth())
return response.json()
def create_group(id, name, x1, y1, x2, y2, topology, group_type, inventory_group_id=0,):
headers = {'content-type': 'application/json'}
response = requests.post(util.get_url() + "/api/v2/canvas/group/", data=json.dumps(dict(id=id,
name=name,
x1=x1,
y1=y1,
x2=x2,
y2=y2,
topology=topology,
group_type=group_type,
inventory_group_id=inventory_group_id,
)),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response.json()
def update_group(group_id, id=None, name=None, x1=None, y1=None, x2=None, y2=None, topology=None, group_type=None, inventory_group_id=None,):
headers = {'content-type': 'application/json'}
data = dict(id=id,
name=name,
x1=x1,
y1=y1,
x2=x2,
y2=y2,
topology=topology,
group_type=group_type,
inventory_group_id=inventory_group_id,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(util.get_url() + "/api/v2/canvas/group/" + str(group_id) + "/",
data=json.dumps(data),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response
def delete_group(group_id):
response = requests.delete(util.get_url() + "/api/v2/canvas/group/" + str(group_id), verify=util.get_verify(), auth=util.get_auth())
return response
def list_groupdevice(**kwargs):
response = util.unpaginate(util.get_url(), '/api/v2/canvas/groupdevice/', util.get_verify(), util.get_auth(), kwargs)
return response
def get_groupdevice(group_device_id):
response = requests.get(util.get_url() + "/api/v2/canvas/groupdevice/" + str(group_device_id), verify=util.get_verify(), auth=util.get_auth())
return response.json()
def create_groupdevice(group, device,):
headers = {'content-type': 'application/json'}
response = requests.post(util.get_url() + "/api/v2/canvas/groupdevice/", data=json.dumps(dict(group=group,
device=device,
)),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response.json()
def update_groupdevice(group_device_id, group=None, device=None,):
headers = {'content-type': 'application/json'}
data = dict(group=group,
device=device,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(util.get_url() + "/api/v2/canvas/groupdevice/" + str(group_device_id) + "/",
data=json.dumps(data),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response
def delete_groupdevice(group_device_id):
response = requests.delete(util.get_url() + "/api/v2/canvas/groupdevice/" + str(group_device_id), verify=util.get_verify(), auth=util.get_auth())
return response
def list_stream(**kwargs):
response = util.unpaginate(util.get_url(), '/api/v2/canvas/stream/', util.get_verify(), util.get_auth(), kwargs)
return response
def get_stream(stream_id):
response = requests.get(util.get_url() + "/api/v2/canvas/stream/" + str(stream_id), verify=util.get_verify(), auth=util.get_auth())
return response.json()
def create_stream(from_device, to_device, label, id=0,):
headers = {'content-type': 'application/json'}
response = requests.post(util.get_url() + "/api/v2/canvas/stream/", data=json.dumps(dict(from_device=from_device,
to_device=to_device,
label=label,
id=id,
)),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response.json()
def update_stream(stream_id, from_device=None, to_device=None, label=None, id=None,):
headers = {'content-type': 'application/json'}
data = dict(from_device=from_device,
to_device=to_device,
label=label,
id=id,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(util.get_url() + "/api/v2/canvas/stream/" + str(stream_id) + "/",
data=json.dumps(data),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response
def delete_stream(stream_id):
response = requests.delete(util.get_url() + "/api/v2/canvas/stream/" + str(stream_id), verify=util.get_verify(), auth=util.get_auth())
return response
def list_process(**kwargs):
response = util.unpaginate(util.get_url(), '/api/v2/canvas/process/', util.get_verify(), util.get_auth(), kwargs)
return response
def get_process(process_id):
response = requests.get(util.get_url() + "/api/v2/canvas/process/" + str(process_id), verify=util.get_verify(), auth=util.get_auth())
return response.json()
def create_process(device, name, process_type, id=0,):
headers = {'content-type': 'application/json'}
response = requests.post(util.get_url() + "/api/v2/canvas/process/", data=json.dumps(dict(device=device,
name=name,
process_type=process_type,
id=id,
)),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response.json()
def update_process(process_id, device=None, name=None, process_type=None, id=None,):
headers = {'content-type': 'application/json'}
data = dict(device=device,
name=name,
process_type=process_type,
id=id,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(util.get_url() + "/api/v2/canvas/process/" + str(process_id) + "/",
data=json.dumps(data),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response
def delete_process(process_id):
response = requests.delete(util.get_url() + "/api/v2/canvas/process/" + str(process_id), verify=util.get_verify(), auth=util.get_auth())
return response
def list_toolbox(**kwargs):
response = util.unpaginate(util.get_url(), '/api/v2/canvas/toolbox/', util.get_verify(), util.get_auth(), kwargs)
return response
def get_toolbox(toolbox_id):
response = requests.get(util.get_url() + "/api/v2/canvas/toolbox/" + str(toolbox_id), verify=util.get_verify(), auth=util.get_auth())
return response.json()
def create_toolbox(name,):
headers = {'content-type': 'application/json'}
response = requests.post(util.get_url() + "/api/v2/canvas/toolbox/", data=json.dumps(dict(name=name,
)),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response.json()
def update_toolbox(toolbox_id, name=None,):
headers = {'content-type': 'application/json'}
data = dict(name=name,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(util.get_url() + "/api/v2/canvas/toolbox/" + str(toolbox_id) + "/",
data=json.dumps(data),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response
def delete_toolbox(toolbox_id):
response = requests.delete(util.get_url() + "/api/v2/canvas/toolbox/" + str(toolbox_id), verify=util.get_verify(), auth=util.get_auth())
return response
def list_toolboxitem(**kwargs):
response = util.unpaginate(util.get_url(), '/api/v2/canvas/toolboxitem/', util.get_verify(), util.get_auth(), kwargs)
return response
def get_toolboxitem(toolbox_item_id):
response = requests.get(util.get_url() + "/api/v2/canvas/toolboxitem/" + str(toolbox_item_id), verify=util.get_verify(), auth=util.get_auth())
return response.json()
def create_toolboxitem(toolbox, data,):
headers = {'content-type': 'application/json'}
response = requests.post(util.get_url() + "/api/v2/canvas/toolboxitem/", data=json.dumps(dict(toolbox=toolbox,
data=data,
)),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response.json()
def update_toolboxitem(toolbox_item_id, toolbox=None, data=None,):
headers = {'content-type': 'application/json'}
data = dict(toolbox=toolbox,
data=data,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(util.get_url() + "/api/v2/canvas/toolboxitem/" + str(toolbox_item_id) + "/",
data=json.dumps(data),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response
def delete_toolboxitem(toolbox_item_id):
response = requests.delete(util.get_url() + "/api/v2/canvas/toolboxitem/" + str(toolbox_item_id), verify=util.get_verify(), auth=util.get_auth())
return response
def list_topologyinventory(**kwargs):
response = util.unpaginate(util.get_url(), '/api/v2/canvas/topologyinventory/', util.get_verify(), util.get_auth(), kwargs)
return response
def get_topologyinventory(topology_inventory_id):
response = requests.get(util.get_url() + "/api/v2/canvas/topologyinventory/" + str(topology_inventory_id), verify=util.get_verify(), auth=util.get_auth())
return response.json()
def create_topologyinventory(topology, inventory_id,):
headers = {'content-type': 'application/json'}
response = requests.post(util.get_url() + "/api/v2/canvas/topologyinventory/", data=json.dumps(dict(topology=topology,
inventory_id=inventory_id,
)),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response.json()
def update_topologyinventory(topology_inventory_id, topology=None, inventory_id=None,):
headers = {'content-type': 'application/json'}
data = dict(topology=topology,
inventory_id=inventory_id,
)
data = {x: y for x, y in data.iteritems() if y is not None}
response = requests.patch(util.get_url() + "/api/v2/canvas/topologyinventory/" + str(topology_inventory_id) + "/",
data=json.dumps(data),
verify=util.get_verify(),
auth=util.get_auth(),
headers=headers)
return response
def delete_topologyinventory(topology_inventory_id):
response = requests.delete(util.get_url() + "/api/v2/canvas/topologyinventory/" +
str(topology_inventory_id), verify=util.get_verify(), auth=util.get_auth())
return response

View File

@ -1 +0,0 @@
alter table prototype_device add constraint prototype_device_topology_id_unique unique (topology_id, id);

View File

@ -5,25 +5,20 @@ from channels.sessions import channel_session
from awx.network_ui.models import Topology, Device, Link, Client, TopologyHistory, MessageType, Interface
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.models import Toolbox, ToolboxItem
from awx.network_ui.models import FSMTrace, EventTrace, Coverage, TopologySnapshot
from awx.network_ui.models import TopologyInventory
from awx.network_ui.models import TestCase, TestResult, CodeUnderTest, Result
from awx.network_ui.messages import MultipleMessage, InterfaceCreate, LinkCreate, to_dict
import urlparse
from django.core.exceptions import ObjectDoesNotExist
from django.db.models import Q
from collections import defaultdict
import math
import random
import logging
from django.utils.dateparse import parse_datetime
from awx.network_ui.utils import transform_dict
import dpath.util
from pprint import pformat
import json
@ -33,16 +28,11 @@ HISTORY_MESSAGE_IGNORE_TYPES = ['DeviceSelected',
'DeviceUnSelected',
'LinkSelected',
'LinkUnSelected',
'Undo',
'Redo',
'MouseEvent',
'MouseWheelEvent',
'KeyEvent']
SPACING = 200
RACK_SPACING = 50
logger = logging.getLogger("awx.network_ui.consumers")
@ -51,209 +41,6 @@ class NetworkUIException(Exception):
pass
def circular_layout(topology_id):
n = Device.objects.filter(topology_id=topology_id).count()
r = 200
if n > 0:
arc_radians = 2 * math.pi / n
else:
arc_radians = 2 * math.pi
for i, device in enumerate(Device.objects.filter(topology_id=topology_id)):
device.x = math.cos(arc_radians * i + math.pi / 4) * r
device.y = math.sin(arc_radians * i + math.pi / 4) * r
device.save()
send_snapshot(Group("topology-%s" % topology_id), topology_id)
def v_distance(graph, grid, device):
d = 0
for edge in graph['edges'][device]:
d += math.sqrt(math.pow(device.x - edge.x, 2) + math.pow(device.y - edge.y, 2))
return d
def reduce_distance(graph, grid):
devices = graph['vertices']
def sum_distances():
distances = {x: v_distance(graph, grid, x) for x in grid.keys()}
return sum(distances.values())
total_distance = sum_distances()
for i in xrange(10000):
a = random.choice(devices)
b = random.choice(devices)
if a == b:
continue
else:
swap(grid, a, b)
place(grid, a)
place(grid, b)
new_total = sum_distances()
if new_total < total_distance:
print "New total", new_total
total_distance = new_total
a.save()
b.save()
else:
swap(grid, a, b)
place(grid, a)
place(grid, b)
def place(grid, device):
device.x = grid[device][1] * SPACING
device.y = grid[device][0] * SPACING
def swap(grid, a, b):
tmp = grid[a]
grid[a] = grid[b]
grid[b] = tmp
def grid_layout(topology_id):
n = Device.objects.filter(topology_id=topology_id).count()
cols = rows = int(math.ceil(math.sqrt(n)))
def device_seq_generator():
for d in Device.objects.filter(topology_id=topology_id):
yield d
device_seq = device_seq_generator()
grid = {}
graph = dict(vertices=[], edges=defaultdict(list))
links = Link.objects.filter(Q(from_device__topology_id=topology_id) |
Q(to_device__topology_id=topology_id))
for l in links:
graph['edges'][l.from_device].append(l.to_device)
graph['edges'][l.to_device].append(l.from_device)
for i in xrange(rows):
for j in xrange(cols):
try:
device = next(device_seq)
graph['vertices'].append(device)
grid[device] = (i, j)
place(grid, device)
device.save()
except StopIteration:
pass
reduce_distance(graph, grid)
send_snapshot(Group("topology-%s" % topology_id), topology_id)
def tier_layout(topology_id):
devices = list(Device.objects.filter(topology_id=topology_id))
device_map = {x.pk: x for x in devices}
links = Link.objects.filter(Q(from_device__topology_id=topology_id) |
Q(to_device__topology_id=topology_id))
def guess_role(devices):
for device in devices:
if getattr(device, "role", None):
continue
if device.type == "host":
device.role = "host"
continue
if device.type == "switch":
if 'leaf' in device.name.lower():
device.role = "leaf"
continue
if 'spine' in device.name.lower():
device.role = "spine"
continue
device.role = "unknown"
guess_role(devices)
edges = defaultdict(set)
racks = []
for l in links:
edges[device_map[l.from_device.pk]].add(device_map[l.to_device.pk])
edges[device_map[l.to_device.pk]].add(device_map[l.from_device.pk])
similar_connections = defaultdict(list)
for device, connections in edges.iteritems():
similar_connections[tuple(connections)].append(device)
for connections, from_devices in similar_connections.iteritems():
if len(from_devices) > 0 and from_devices[0].role == "host":
racks.append(from_devices)
tiers = defaultdict(list)
for device in devices:
if getattr(device, 'tier', None):
pass
elif device.role == "leaf":
device.tier = 1
elif device.role == "spine":
device.tier = 2
elif device.role == "host":
device.tier = 0
else:
device.tier = 3
tiers[device.tier].append(device)
for rack in racks:
rack.sort(key=lambda x: x.name)
racks.sort(key=lambda x: x[0].name)
for tier in tiers.values():
tier.sort(key=lambda x: x.name)
for device in devices:
print device, getattr(device, 'tier', None)
if getattr(device, 'tier', None) is None:
device.y = 0
device.x = 0
else:
device.y = SPACING * 3 - device.tier * SPACING
device.x = 0 - (len(tiers[device.tier]) * SPACING) / 2 + tiers[device.tier].index(device) * SPACING
device.save()
for j, rack in enumerate(racks):
x = 0 - (len(racks) * SPACING) / 2 + j * SPACING
for i, device in enumerate(rack):
device.x = x
device.y = SPACING * 3 + i * RACK_SPACING
device.save()
send_snapshot(Group("topology-%s" % topology_id), topology_id)
def parse_topology_id(data):
topology_id = data.get('topology_id', ['null'])
try:
topology_id = int(topology_id[0])
except ValueError:
topology_id = None
if not topology_id:
topology_id = None
return topology_id
def parse_inventory_id(data):
inventory_id = data.get('inventory_id', ['null'])
try:
@ -276,7 +63,7 @@ class _Persistence(object):
assert client_id is not None, "No client_id"
data = json.loads(message['text'])
if isinstance(data[1], list):
print "no sender"
logger.error("Message has no sender")
return
if isinstance(data[1], dict) and client_id != data[1].get('sender'):
logger.error("client_id mismatch expected: %s actual %s", client_id, data[1].get('sender'))
@ -321,7 +108,6 @@ class _Persistence(object):
id='id',
host_id='host_id'), device)
logger.info("Device %s", device)
print ("Device %s" % device)
d, _ = Device.objects.get_or_create(topology_id=topology_id, id=device['id'], defaults=device)
d.x = device['x']
d.y = device['y']
@ -346,23 +132,6 @@ class _Persistence(object):
def onDeviceLabelEdit(self, device, topology_id, client_id):
Device.objects.filter(topology_id=topology_id, id=device['id']).update(name=device['name'])
for pk in Device.objects.filter(topology_id=topology_id, id=device['id']).values_list('pk', flat=True):
for db in DataBinding.objects.filter(primary_key_id=pk,
table="Device",
field="name").values('sheet__client_id',
'sheet__name',
'column',
'row'):
message = ['TableCellEdit', dict(sender=0,
msg_type="TableCellEdit",
sheet=db['sheet__name'],
col=db['column'] + 1,
row=db['row'] + 2,
new_value=device['name'],
old_value=device['previous_name'])]
logger.info("Sending message %r", message)
Group("topology-%s-client-%s" % (topology_id, db['sheet__client_id'])).send({"text": json.dumps(message)})
def onInterfaceLabelEdit(self, interface, topology_id, client_id):
(Interface.objects
@ -457,12 +226,6 @@ class _Persistence(object):
'Ignore LinkSelected messages'
pass
def onUndo(self, message_value, topology_id, client_id):
undo_persistence.handle(message_value['original_message'], topology_id, client_id)
def onRedo(self, message_value, topology_id, client_id):
redo_persistence.handle(message_value['original_message'], topology_id, client_id)
def onMultipleMessage(self, message_value, topology_id, client_id):
for message in message_value['messages']:
handler = self.get_handler(message['msg_type'])
@ -471,12 +234,6 @@ class _Persistence(object):
else:
logger.warning("Unsupported message %s", message['msg_type'])
def onLayout(self, message_value, topology_id, client_id):
# circular_layout(topology_id)
# grid_layout(topology_id)
tier_layout(topology_id)
def onCoverageRequest(self, coverage, topology_id, client_id):
pass
@ -484,23 +241,15 @@ class _Persistence(object):
xyz, _, rest = test_result['code_under_test'].partition('-')
commits_since, _, commit_hash = rest.partition('-')
commit_hash = commit_hash.strip('g')
print (xyz)
print (commits_since)
print (commit_hash)
x, y, z = [int(i) for i in xyz.split('.')]
print (x, y, z)
code_under_test, _ = CodeUnderTest.objects.get_or_create(version_x=x,
version_y=y,
version_z=z,
commits_since=int(commits_since),
commit_hash=commit_hash)
print (code_under_test)
tr = TestResult(id=test_result['id'],
result_id=Result.objects.get(name=test_result['result']).pk,
test_case_id=TestCase.objects.get(name=test_result['name']).pk,
@ -508,7 +257,6 @@ class _Persistence(object):
client_id=client_id,
time=parse_datetime(test_result['date']))
tr.save()
print (tr.pk)
def onCoverage(self, coverage, topology_id, client_id):
@ -605,249 +353,6 @@ class _Persistence(object):
persistence = _Persistence()
class _UndoPersistence(object):
def handle(self, message, topology_id, client_id):
message_type = message[0]
message_value = message[1]
TopologyHistory.objects.filter(topology_id=topology_id,
client_id=message_value['sender'],
message_id=message_value['message_id']).update(undone=True)
handler = getattr(self, "on{0}".format(message_type), None)
if handler is not None:
handler(message_value, topology_id, client_id)
else:
logger.warning("Unsupported undo message %s", message_type)
def onSnapshot(self, snapshot, topology_id, client_id):
pass
def onDeviceCreate(self, device, topology_id, client_id):
persistence.onDeviceDestroy(device, topology_id, client_id)
def onDeviceDestroy(self, device, topology_id, client_id):
inverted = device.copy()
inverted['type'] = device['previous_type']
inverted['name'] = device['previous_name']
inverted['x'] = device['previous_x']
inverted['y'] = device['previous_y']
persistence.onDeviceCreate(inverted, topology_id, client_id)
def onDeviceMove(self, device, topology_id, client_id):
inverted = device.copy()
inverted['x'] = device['previous_x']
inverted['y'] = device['previous_y']
persistence.onDeviceMove(inverted, topology_id, client_id)
def onDeviceLabelEdit(self, device, topology_id, client_id):
inverted = device.copy()
inverted['name'] = device['previous_name']
persistence.onDeviceLabelEdit(inverted, topology_id, client_id)
def onLinkCreate(self, link, topology_id, client_id):
persistence.onLinkDestroy(link, topology_id, client_id)
def onLinkDestroy(self, link, topology_id, client_id):
persistence.onLinkCreate(link, topology_id, client_id)
def onDeviceSelected(self, message_value, topology_id, client_id):
'Ignore DeviceSelected messages'
pass
def onDeviceUnSelected(self, message_value, topology_id, client_id):
'Ignore DeviceSelected messages'
pass
def onUndo(self, message_value, topology_id, client_id):
pass
undo_persistence = _UndoPersistence()
class _RedoPersistence(object):
def handle(self, message, topology_id, client_id):
message_type = message[0]
message_value = message[1]
TopologyHistory.objects.filter(topology_id=topology_id,
client_id=message_value['sender'],
message_id=message_value['message_id']).update(undone=False)
handler_name = "on{0}".format(message_type)
handler = getattr(self, handler_name, getattr(persistence, handler_name, None))
if handler is not None:
handler(message_value, topology_id, client_id)
else:
logger.warning("Unsupported redo message %s", message_type)
def onDeviceSelected(self, message_value, topology_id, client_id):
'Ignore DeviceSelected messages'
pass
def onDeviceUnSelected(self, message_value, topology_id, client_id):
'Ignore DeviceSelected messages'
pass
def onUndo(self, message_value, topology_id, client_id):
'Ignore Undo messages'
pass
def onRedo(self, message_value, topology_id, client_id):
'Ignore Redo messages'
pass
redo_persistence = _RedoPersistence()
class _Discovery(object):
def handle(self, message):
topology_id = message.get('topology')
data = json.loads(message['text'])
message_type = data[0]
message_value = data[1]
handler = self.get_handler(message_type)
if handler is not None:
handler(message_value, topology_id)
else:
logger.warning("Unsupported discovery message %s", message_type)
def get_handler(self, message_type):
return getattr(self, "on{0}".format(message_type), None)
def onFacts(self, message, topology_id):
send_updates = False
logger.info("onFacts message key %s", message['key'])
#logger.info("onFacts message %s", pformat(message))
device_name = message['key']
updates = MultipleMessage('MultipleMessage', [])
try:
device = Device.objects.get(topology_id=topology_id, name=device_name)
except ObjectDoesNotExist:
logger.info("onFacts Could not find %s in topology %s", device_name, topology_id)
return
try:
interfaces = dpath.util.get(message, '/value/ansible_net_neighbors')
logger.info(pformat(interfaces))
except KeyError:
interfaces = {}
logger.info("onFacts %s: ", pformat(interfaces))
"""
ansible_net_neighbors example:
{u'eth1': [{u'host': u'Spine1', u'port': u'eth3'}],
u'eth2': [{u'host': u'Spine2', u'port': u'eth3'}],
u'eth3': [{u'host': u'Host2', u'port': u'eth1'}]}
"""
for interface_name, neighbors in interfaces.iteritems():
logger.info("interface_name %s neighbors %s", interface_name, neighbors)
interface, created = Interface.objects.get_or_create(device_id=device.pk,
name=interface_name,
defaults=dict(id=0))
if created:
interface.id = interface.pk
interface.save()
updates.messages.append(InterfaceCreate('InterfaceCreate',
0,
interface.device.id,
interface.id,
interface.name))
send_updates = True
logger.info("Created interface %s", interface)
for neighbor in neighbors:
logger.info("neighbor %s", neighbor)
connected_interface = None
connected_device = None
neighbor_name = neighbor.get('host')
if not neighbor_name:
continue
try:
connected_device = Device.objects.get(topology_id=topology_id, name=neighbor_name)
except ObjectDoesNotExist:
continue
logger.info("neighbor %s %s", neighbor_name, connected_device.pk)
remote_interface_name = neighbor.get('port')
connected_interface, created = Interface.objects.get_or_create(device_id=connected_device.pk,
name=remote_interface_name,
defaults=dict(id=0))
if created:
connected_interface.id = connected_interface.pk
connected_interface.save()
updates.messages.append(InterfaceCreate('InterfaceCreate',
0,
connected_interface.device.id,
connected_interface.id,
connected_interface.name))
logger.info("Created interface %s", connected_interface)
send_updates = True
if connected_device and connected_interface:
exists = Link.objects.filter(Q(from_device_id=device.pk,
to_device_id=connected_device.pk,
from_interface_id=interface.pk,
to_interface_id=connected_interface.pk) |
Q(from_device_id=connected_device.pk,
to_device_id=device.pk,
from_interface_id=connected_interface.pk,
to_interface_id=interface.pk)).count() > 0
if not exists:
link = Link(from_device_id=device.pk,
to_device_id=connected_device.pk,
from_interface_id=interface.pk,
to_interface_id=connected_interface.pk,
id=0)
link.save()
link.id = link.pk
link.save()
updates.messages.append(LinkCreate('LinkCreate',
0,
link.id,
link.name,
link.from_device.id,
link.to_device.id,
link.from_interface.id,
link.to_interface.id))
logger.info("Created link %s", link)
send_updates = True
if send_updates:
logger.info("onFacts send_updates")
channel = Group("topology-%s" % topology_id)
channel.send({"text": json.dumps([updates.msg_type, to_dict(updates)])})
discovery = _Discovery()
# Ansible Connection Events
@channel_session
def ansible_connect(message):
data = urlparse.parse_qs(message.content['query_string'])
topology_id = parse_topology_id(data)
message.channel_session['topology_id'] = topology_id
@channel_session
def ansible_message(message):
# Channel('console_printer').send({"text": message['text']})
Group("topology-%s" % message.channel_session['topology_id']).send({"text": message['text']})
Channel('discovery').send({"text": message['text'],
"topology": message.channel_session['topology_id']})
@channel_session
def ansible_disconnect(message):
pass
# UI Channel Events
@channel_session
@ -856,11 +361,9 @@ def ws_connect(message):
data = urlparse.parse_qs(message.content['query_string'])
inventory_id = parse_inventory_id(data)
topology_ids = list(TopologyInventory.objects.filter(inventory_id=inventory_id).values_list('topology_id', flat=True))
print ("topology_ids", topology_ids)
topology_id = 0
if len(topology_ids) > 0:
topology_id = topology_ids[0]
print ("topology_id", topology_id)
if topology_id:
topology = Topology.objects.get(topology_id=topology_id)
else:
@ -977,8 +480,6 @@ def send_history(channel, topology_id):
@channel_session
def ws_message(message):
# Send to debug printer
# Channel('console_printer').send({"text": message['text']})
# Send to all clients editing the topology
Group("topology-%s" % message.channel_session['topology_id']).send({"text": message['text']})
# Send to persistence handler
@ -992,208 +493,3 @@ def ws_disconnect(message):
if 'topology_id' in message.channel_session:
Group("topology-%s" % message.channel_session['topology_id']).discard(message.reply_channel)
def console_printer(message):
print message['text'] # pragma: no cover
# Tester channel events
@channel_session
def tester_connect(message):
data = urlparse.parse_qs(message.content['query_string'])
topology_id = parse_topology_id(data)
message.channel_session['topology_id'] = topology_id
client = Client()
client.save()
message.channel_session['client_id'] = client.pk
message.reply_channel.send({"text": json.dumps(["id", client.pk])})
message.reply_channel.send({"text": json.dumps(["topology_id", topology_id])})
@channel_session
def tester_message(message):
# Channel('console_printer').send({"text": message['text']})
Group("topology-%s" % message.channel_session['topology_id']).send({"text": message['text']})
Channel('persistence').send({"text": message['text'],
"topology": message.channel_session['topology_id'],
"client": message.channel_session['client_id']})
@channel_session
def tester_disconnect(message):
pass
# Tables UI channel events
def make_sheet(data, column_headers=[]):
sheet = []
if len(data):
n_columns = max([len(x) for x in data]) - 1
else:
n_columns = 0
row_i = 0
sheet.append([dict(value=x, editable=False) for x in list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")[0:n_columns]])
row_i += 1
if column_headers:
sheet.append([dict(value=row_i, editable=False)] + [dict(value=x, editable=False) for x in column_headers])
row_i += 1
for row in data:
sheet_row = [dict(value=row_i, editable=False)]
row_i += 1
sheet_row.extend([dict(value=x, editable=True, col=i, row=row_i) for i, x in enumerate(row[1:])])
sheet.append(sheet_row)
return sheet
def make_bindings(sheet_id, klass, filter_q, values_list, order_by):
values_list = ['pk'] + values_list
data = list(klass.objects.filter(**filter_q).values_list(*values_list).order_by(*order_by))
data_types = set()
for row in data:
for cell in row:
data_types.add(type(cell).__name__)
data_type_map = dict()
logger.info(repr(data_types))
for dt in list(data_types):
data_type_map[dt] = DataType.objects.get_or_create(type_name=dt)[0].pk
logger.info(repr(data_type_map))
bindings = []
for row_i, row in enumerate(data):
pk = row[0]
for col_i, cell in enumerate(row[1:]):
field = values_list[col_i + 1]
if '__' in field:
continue
logger.info("make_bindings %s %s %s %s %s %s %s", sheet_id, klass.__name__, pk, col_i, row_i, field, data_type_map[type(cell).__name__])
bindings.append(DataBinding.objects.get_or_create(sheet_id=sheet_id,
column=col_i,
row=row_i,
table=klass.__name__,
primary_key_id=pk,
field=field,
data_type_id=data_type_map[type(cell).__name__])[0])
return data
@channel_session
def tables_connect(message):
data = urlparse.parse_qs(message.content['query_string'])
topology_id = parse_topology_id(data)
message.channel_session['topology_id'] = topology_id
client = Client()
client.save()
Group("topology-%s-client-%s" % (topology_id, client.pk)).add(message.reply_channel)
message.channel_session['client_id'] = client.pk
message.reply_channel.send({"text": json.dumps(["id", client.pk])})
message.reply_channel.send({"text": json.dumps(["topology_id", topology_id])})
device_sheet, _ = DataSheet.objects.get_or_create(topology_id=topology_id, client_id=client.pk, name="Devices")
data = make_bindings(device_sheet.pk, Device, dict(topology_id=topology_id), ['name'], ['name'])
message.reply_channel.send({"text": json.dumps(["sheet", dict(name="Devices", data=make_sheet(data, ['Device Name']))])})
interface_sheet, _ = DataSheet.objects.get_or_create(topology_id=topology_id, client_id=client.pk, name="Interfaces")
data = make_bindings(interface_sheet.pk, Interface, dict(device__topology_id=topology_id), ['device__name', 'name'], ['device__name', 'name'])
message.reply_channel.send({"text": json.dumps(["sheet", dict(name="Interfaces", data=make_sheet(data, ['Device Name', 'Interface Name']))])})
group_sheet, _ = DataSheet.objects.get_or_create(topology_id=topology_id, client_id=client.pk, name="Groups")
data = make_bindings(group_sheet.pk, DeviceGroup, dict(topology_id=topology_id), ['name'], ['name'])
message.reply_channel.send({"text": json.dumps(["sheet", dict(name="Groups", data=make_sheet(data, ['Group Name']))])})
def device_label_edit(o):
d = transform_dict(dict(name='name',
id='id',
old_value='previous_name'), o.__dict__)
d['msg_type'] = 'DeviceLabelEdit'
return ['DeviceLabelEdit', d]
def group_label_edit(o):
d = transform_dict(dict(name='name',
id='id',
old_value='previous_name'), o.__dict__)
d['msg_type'] = 'GroupLabelEdit'
return ['GroupLabelEdit', d]
def interface_label_edit(o):
d = o.__dict__
d['device_id'] = o.device.id
d = transform_dict(dict(name='name',
id='id',
device_id='device_id',
old_value='previous_name'), o.__dict__)
d['msg_type'] = 'InterfaceLabelEdit'
return ['InterfaceLabelEdit', d]
@channel_session
def tables_message(message):
data = json.loads(message['text'])
logger.info(data[0])
logger.info(data[1])
data_type_mapping = {'unicode': unicode,
'int': int}
table_mapping = {'Device': Device,
'Interface': Interface,
'Group': DeviceGroup}
transformation_mapping = {('Device', 'name'): device_label_edit,
('Interface', 'name'): interface_label_edit,
('Group', 'name'): group_label_edit}
if data[0] == "TableCellEdit":
topology_id = message.channel_session['topology_id']
group_channel = Group("topology-%s" % topology_id)
client_id = message.channel_session['client_id']
data_sheet = DataSheet.objects.get(topology_id=topology_id, client_id=client_id, name=data[1]['sheet']).pk
logger.info("DataSheet %s", data_sheet)
data_bindings = DataBinding.objects.filter(sheet_id=data_sheet,
column=data[1]['col'] - 1,
row=data[1]['row'] - 2)
logger.info("Found %s bindings", data_bindings.count())
logger.info(repr(data_bindings.values('table', 'data_type__type_name', 'field', 'primary_key_id')))
for table, data_type, field, pk in data_bindings.values_list('table', 'data_type__type_name', 'field', 'primary_key_id'):
new_value = data_type_mapping[data_type](data[1]['new_value'])
old_value = data_type_mapping[data_type](data[1]['old_value'])
logger.info("Updating %s", table_mapping[table].objects.filter(pk=pk).values())
table_mapping[table].objects.filter(pk=pk).update(**{field: new_value})
logger.info("Updated %s", table_mapping[table].objects.filter(pk=pk).count())
for o in table_mapping[table].objects.filter(pk=pk):
o.old_value = old_value
message = transformation_mapping[(table, field)](o)
message[1]['sender'] = 0
logger.info("Sending %r", message)
group_channel.send({"text": json.dumps(message)})
@channel_session
def tables_disconnect(message):
pass

View File

@ -1,526 +0,0 @@
app: awx.network_ui
external_models: []
models:
- api: true
display: name
fields:
- name: device_id
pk: true
type: AutoField
- name: topology
ref: Topology
ref_field: topology_id
type: ForeignKey
- len: 200
name: name
type: CharField
- name: x
type: IntegerField
- name: y
type: IntegerField
- name: id
type: IntegerField
- len: 200
name: type
type: CharField
- default: 0
name: interface_id_seq
type: IntegerField
- default: 0
name: process_id_seq
type: IntegerField
- default: 0
name: host_id
type: IntegerField
name: Device
topology_id_query: topology_id
x: 348
y: 124
- api: true
create_transform:
from_device__id: from_device_id
from_interface__id: from_interface_id
id: id
name: name
to_device__id: to_device_id
to_interface__id: to_interface_id
fields:
- name: link_id
pk: true
type: AutoField
- name: from_device
ref: Device
ref_field: device_id
related_name: from_link
type: ForeignKey
- name: to_device
ref: Device
ref_field: device_id
related_name: to_link
type: ForeignKey
- name: from_interface
ref: Interface
ref_field: interface_id
related_name: from_link
type: ForeignKey
- name: to_interface
ref: Interface
ref_field: interface_id
related_name: to_link
type: ForeignKey
- name: id
type: IntegerField
- len: 200
name: name
type: CharField
name: Link
topology_id_query: from_device__topology_id
x: 837
y: 10
- api: true
display: name
fields:
- name: topology_id
pk: true
type: AutoField
- len: 200
name: name
type: CharField
- name: scale
type: FloatField
- name: panX
type: FloatField
- name: panY
type: FloatField
- default: 0
name: device_id_seq
type: IntegerField
- default: 0
name: link_id_seq
type: IntegerField
- default: 0
name: group_id_seq
type: IntegerField
- default: 0
name: stream_id_seq
type: IntegerField
name: Topology
topology_id_query: topology_id
x: 111
y: 127
- fields:
- name: client_id
pk: true
type: AutoField
name: Client
x: -518
y: 138
- fields:
- name: topology_history_id
pk: true
type: AutoField
- name: topology
ref: Topology
ref_field: topology_id
type: ForeignKey
- name: client
ref: Client
ref_field: client_id
type: ForeignKey
- name: message_type
ref: MessageType
ref_field: message_type_id
type: ForeignKey
- name: message_id
type: IntegerField
- name: message_data
type: TextField
- default: false
name: undone
type: BooleanField
name: TopologyHistory
x: -205
y: 282
- display: name
fields:
- name: message_type_id
pk: true
type: AutoField
- len: 200
name: name
type: CharField
name: MessageType
x: -501
y: 428
- api: true
create_transform:
device__id: device_id
id: id
name: name
display: name
fields:
- name: interface_id
pk: true
type: AutoField
- name: device
ref: Device
ref_field: device_id
type: ForeignKey
- len: 200
name: name
type: CharField
- name: id
type: IntegerField
name: Interface
topology_id_query: device__topology_id
x: 1157
y: 337
- api: true
fields:
- name: group_id
pk: true
type: AutoField
- name: id
type: IntegerField
- len: 200
name: name
type: CharField
- name: x1
type: IntegerField
- name: y1
type: IntegerField
- name: x2
type: IntegerField
- name: y2
type: IntegerField
- name: topology
ref: Topology
ref_field: topology_id
type: ForeignKey
- len: 200
name: type
type: CharField
name: Group
topology_id_query: topology_id
x: 407
y: -379
- api: true
fields:
- name: group_device_id
pk: true
type: AutoField
- name: group
ref: Group
ref_field: group_id
type: ForeignKey
- name: device
ref: Device
ref_field: device_id
type: ForeignKey
name: GroupDevice
topology_id_query: group__topology_id
x: 739
y: -234
- fields:
- name: data_binding_id
pk: true
type: AutoField
- name: column
type: IntegerField
- name: row
type: IntegerField
- len: 200
name: table
type: CharField
- name: primary_key_id
type: IntegerField
- len: 200
name: field
type: CharField
- name: data_type
ref: DataType
ref_field: data_type_id
type: ForeignKey
- name: sheet
ref: DataSheet
ref_field: data_sheet_id
type: ForeignKey
name: DataBinding
x: -515
y: -370
- fields:
- name: data_type_id
pk: true
type: AutoField
- len: 200
name: type_name
type: CharField
name: DataType
x: -782
y: -172
- fields:
- name: data_sheet_id
pk: true
type: AutoField
- len: 200
name: name
type: CharField
- name: topology
ref: Topology
ref_field: topology_id
type: ForeignKey
- name: client
ref: Client
ref_field: client_id
type: ForeignKey
name: DataSheet
x: -207
y: -282
- api: true
fields:
- name: stream_id
pk: true
ref: Stream
ref_field: stream_id
type: AutoField
- name: from_device
ref: Device
ref_field: device_id
related_name: from_stream
type: ForeignKey
- name: to_device
ref: Device
ref_field: device_id
related_name: to_stream
type: ForeignKey
- len: 200
name: label
type: CharField
- default: 0
name: id
type: IntegerField
name: Stream
topology_id_query: from_device__topology_id
x: 709
y: 527
- api: true
fields:
- name: process_id
pk: true
type: AutoField
- name: device
ref: Device
ref_field: device_id
type: ForeignKey
- len: 200
name: name
type: CharField
- len: 200
name: type
type: CharField
- default: 0
name: id
type: IntegerField
name: Process
topology_id_query: device__topology_id
x: 654
y: 778
- api: true
fields:
- name: toolbox_id
pk: true
type: AutoField
- len: 200
name: name
type: CharField
name: Toolbox
x: 179
y: 644
- api: true
fields:
- name: toolbox_item_id
pk: true
type: AutoField
- name: toolbox
ref: Toolbox
ref_field: toolbox_id
type: ForeignKey
- name: data
type: TextField
name: ToolboxItem
x: 391
y: 645
- fields:
- name: fsm_trace_id
pk: true
type: AutoField
- len: 200
name: fsm_name
type: CharField
- len: 200
name: from_state
type: CharField
- len: 200
name: to_state
type: CharField
- len: 200
name: message_type
type: CharField
- name: client
ref: Client
ref_field: client_id
type: ForeignKey
- default: 0
name: trace_session_id
type: IntegerField
- default: 0
name: order
type: IntegerField
name: FSMTrace
x: -872
y: 507
- api: true
fields:
- name: topology_inventory_id
pk: true
type: AutoField
- name: topology
ref: Topology
ref_field: topology_id
type: ForeignKey
- name: inventory_id
type: IntegerField
name: TopologyInventory
topology_id_query: topology_id
x: -226
y: -19
- fields:
- name: event_trace_id
pk: true
type: AutoField
- name: client
ref: Client
ref_field: client_id
type: ForeignKey
- default: 0
name: trace_session_id
type: IntegerField
- name: event_data
type: TextField
- name: message_id
type: IntegerField
name: EventTrace
x: -1087
y: 202
- fields:
- name: coverage_id
pk: true
type: AutoField
- name: coverage_data
type: TextField
- name: test_result
ref: TestResult
ref_field: test_result_id
type: ForeignKey
name: Coverage
x: -1068
y: -4
- fields:
- name: topology_snapshot_id
pk: true
type: AutoField
- name: client
ref: Client
ref_field: client_id
type: ForeignKey
- name: topology_id
type: IntegerField
- name: trace_session_id
type: IntegerField
- name: snapshot_data
ref: TopologySnapshot
ref_field: snapshot_data
type: TextField
- name: order
type: IntegerField
name: TopologySnapshot
x: -1123
y: -277
- fields:
- name: test_case_id
pk: true
type: AutoField
- len: 200
name: name
ref: TestCase
ref_field: name
type: CharField
- name: test_case_data
type: TextField
name: TestCase
x: -1642
y: -38
- fields:
- name: result_id
pk: true
type: AutoField
- len: 20
name: name
type: CharField
name: Result
x: -1610
y: 120
- fields:
- name: code_under_test_id
pk: true
ref: CodeUnderTest
ref_field: code_under_test_id
type: AutoField
- name: version_x
type: IntegerField
- name: version_y
type: IntegerField
- name: version_z
type: IntegerField
- name: commits_since
type: IntegerField
- len: 40
name: commit_hash
type: CharField
name: CodeUnderTest
x: -1612
y: 259
- fields:
- name: test_result_id
pk: true
type: AutoField
- name: test_case
ref: TestCase
ref_field: test_case_id
type: ForeignKey
- name: result
ref: Result
ref_field: result_id
type: ForeignKey
- name: code_under_test
ref: CodeUnderTest
ref_field: code_under_test_id
type: ForeignKey
- name: time
type: DateTimeField
- default: 0
name: id
type: IntegerField
- name: client
ref: Client
ref_field: client_id
type: ForeignKey
name: TestResult
x: -1336
y: -49
modules: []
view:
panX: 213.729555519212
panY: 189.446959094643
scaleXY: 0.69

View File

@ -1 +0,0 @@
#---- create_device

View File

@ -1 +0,0 @@
#---- create_group

View File

@ -1 +0,0 @@
#---- create_groupdevice

View File

@ -1 +0,0 @@
#---- create_interface

View File

@ -1 +0,0 @@
#---- create_link

View File

@ -1 +0,0 @@
#---- create_process

View File

@ -1 +0,0 @@
#---- create_stream

View File

@ -1 +0,0 @@
#---- create_toolbox

View File

@ -1 +0,0 @@
#---- create_toolboxitem

View File

@ -1 +0,0 @@
#---- create_topology

View File

@ -1 +0,0 @@
#---- create_topologyinventory

View File

@ -1 +0,0 @@
#---- delete_device

View File

@ -1 +0,0 @@
#---- delete_group

View File

@ -1 +0,0 @@
#---- delete_groupdevice

View File

@ -1 +0,0 @@
#---- delete_interface

View File

@ -1 +0,0 @@
#---- delete_link

View File

@ -1 +0,0 @@
#---- delete_process

View File

@ -1 +0,0 @@
#---- delete_stream

View File

@ -1 +0,0 @@
#---- delete_toolbox

View File

@ -1 +0,0 @@
#---- delete_toolboxitem

View File

@ -1 +0,0 @@
#---- delete_topology

View File

@ -1 +0,0 @@
#---- delete_topologyinventory

View File

@ -1 +0,0 @@
#---- get_device

View File

@ -1 +0,0 @@
#---- get_group

View File

@ -1 +0,0 @@
#---- get_groupdevice

View File

@ -1 +0,0 @@
#---- get_interface

View File

@ -1 +0,0 @@
#---- get_link

View File

@ -1 +0,0 @@
#---- get_process

View File

@ -1 +0,0 @@
#---- get_stream

View File

@ -1 +0,0 @@
#---- get_toolbox

View File

@ -1 +0,0 @@
#---- get_toolboxitem

View File

@ -1 +0,0 @@
#---- get_topology

View File

@ -1 +0,0 @@
#---- get_topologyinventory

Some files were not shown because too many files have changed in this diff Show More