Adding DON changes to the repo

Change-Id: I694a3483cfddd5cff8d0a95466087b0e0e9897ba
This commit is contained in:
Ramaraja 2016-08-01 10:03:58 +00:00
parent be885916b0
commit 508920a121
96 changed files with 11148 additions and 3 deletions

6
etc/don/don.conf Normal file
View File

@ -0,0 +1,6 @@
[DEFAULT]
# Deployment type should be devstack/multinode
deployment_type=multinode
[neutron]

View File

View File

@ -0,0 +1,22 @@
from don import models
def save_data(timestamp, data):
wb = models.collector.objects.create(timestamp=timestamp, data=data)
wb.save()
return True
def list_collection(request):
return models.collector.objects.values('id', 'timestamp', 'data')
def get_collection(request, id=None):
try:
return models.collector.objects.get(id=id)
except models.collector.DoesNotExist:
return None
def remove_collection(request, id):
models.collector.objects.get(id=id).delete()

View File

@ -0,0 +1,10 @@
from django.utils.translation import ugettext_lazy as _
import horizon
from don import dashboard
class archive(horizon.Panel):
name = _("Archive")
slug = "archive"
dashboard.DonDashboard.register(archive)

View File

@ -0,0 +1,11 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "DON Archive" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("DON Archive") %}
{% endblock page_header %}
{% block main %}
{{ table.render }}
{% endblock %}

View File

@ -0,0 +1,11 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "DON View" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("View") %}
{% endblock page_header %}
{% block main %}
<!-- {{ table.render }} -->
{% endblock %}

View File

@ -0,0 +1,13 @@
from django.conf.urls import patterns
from django.conf.urls import url
from don.archive.views \
import ArchiveView
from . import views
urlpatterns = patterns(
'',
# url(r'^dbview/',DBView.as_view() , name='dbview'),
url(r'^dbview/', views.dbview, name='dbview'),
url(r'^$', ArchiveView.as_view(), name='index'),
)

View File

@ -0,0 +1,49 @@
from django.core.urlresolvers import reverse
from don import api
from don import tables as don_tables
from horizon import tables
# from horizon.views import APIView
import time
from django.conf import settings
from django import http
class ArchiveView(tables.DataTableView):
template_name = 'don/archive/index.html'
table_class = don_tables.CollectionTable
def get_data(self):
data = api.list_collection(self.request)
for item in data:
item['timestamp'] = str(time.ctime(float(item.get('timestamp'))))
return data
def dbview(request):
id = request.GET.get('id')
data = api.get_collection(request, id)
pwd = settings.ROOT_PATH
JSON_FILE = pwd + '/don/ovs/don.json'
don = open(JSON_FILE, 'w')
don.write(str(data.data))
don.close()
return http.HttpResponseRedirect(
reverse('horizon:don:ovs:view'))
'''
class DBView(APIView):
template_name = 'don/archive/view.html'
def get_data(self,request, context, *args, **kwargs):
id = self.request.GET.get('id')
data = api.get_collection(self.request,id)
pwd = settings.ROOT_PATH
JSON_FILE = pwd + '/don/ovs/don.json'
don = open(JSON_FILE,'w')
don.write(str(data.data))
don.close()
time.sleep(2)
return http.HttpResponseRedirect(
reverse('horizon:don:ovs:view'))
'''

View File

@ -0,0 +1,13 @@
from django.utils.translation import ugettext_lazy as _
import horizon
class DonDashboard(horizon.Dashboard):
name = _("DON")
slug = "don"
panels = ('ovs', 'archive') # Add your panels here.
default_panel = 'ovs' # Specify the slug of the dashboard's default panel.
horizon.register(DonDashboard)

View File

@ -0,0 +1,11 @@
"""
Stub file to work around django bug: https://code.djangoproject.com/ticket/7198
"""
from django.db import models
class collector(models.Model):
# collector table fields
timestamp = models.CharField(max_length=50)
data = models.TextField()

View File

View File

@ -0,0 +1,37 @@
#!/bin/bash
# To use an OpenStack cloud you need to authenticate against the Identity
# service named keystone, which returns a **Token** and **Service Catalog**.
# The catalog contains the endpoints for all services the user/tenant has
# access to - such as Compute, Image Service, Identity, Object Storage, Block
# Storage, and Networking (code-named nova, glance, keystone, swift,
# cinder, and neutron).
#
# *NOTE*: Using the 2.0 *Identity API* does not necessarily mean any other
# OpenStack API is version 2.0. For example, your cloud provider may implement
# Image API v1.1, Block Storage API v2, and Compute API v2.0. OS_AUTH_URL is
# only for the Identity API served through keystone.
export OS_AUTH_URL=http://10.0.2.15:5000/v2.0
# With the addition of Keystone we have standardized on the term **tenant**
# as the entity that owns the resources.
export OS_TENANT_ID=5e40d18284c34e0fb9cdb6f92f651f71
export OS_TENANT_NAME="admin"
export OS_PROJECT_NAME="admin"
# In addition to the owning entity (tenant), OpenStack stores the entity
# performing the action as the **user**.
export OS_USERNAME="admin"
# With Keystone you pass the keystone password.
#echo "Please enter your OpenStack Password: "
#read -sr OS_PASSWORD_INPUT
#export OS_PASSWORD=$OS_PASSWORD_INPUT
export OS_PASSWORD="password"
# If your configuration has multiple regions, we set that information here.
# OS_REGION_NAME is optional and only valid in certain environments.
export OS_REGION_NAME="RegionOne"
# Don't leave a blank variable, unset it if it was empty
if [ -z "$OS_REGION_NAME" ]; then unset OS_REGION_NAME; fi

View File

@ -0,0 +1,412 @@
#
# analyzer.py:
#
# This file implements the following:
# 1. Analysis of the collected info
# 2. Report any problems
# 3. Report what is correct
#
import pprint
import re
import argparse
import subprocess
import json
import os
from itertools import combinations
from common import settings, debug, get_router
from common import load_json, get_subnet, is_network_public
import yaml
tick = '&#10004;'
cross = '&#10008;'
def get_vm_qrouters(info, vm):
vms = info['vms']
if not vms.has_key(vm):
return 'unknown'
# Get IP of any of the VM's interfaces
for ip in vms[vm]['interfaces'].keys():
break
routers = []
subnet = get_subnet(ip)
namespaces = info['namespaces']
for nms in namespaces.keys():
if re.search('^qrouter-', nms):
if not namespaces[nms].has_key('interfaces'):
continue
for intf in namespaces[nms]['interfaces'].keys():
ip = namespaces[nms]['interfaces'][intf]
if re.search(subnet, ip):
routers.append(nms)
return routers
# Even if there is one qrouter namespace via which all ping tests passed, we
# consider the ping test to be a success.
def did_ping_test_pass(cmds):
qrouter_result = True
for qrouter in sorted(cmds.keys()):
debug('Checking ping status in qrouter %s' % qrouter)
qrouter_result = True
for key in cmds[qrouter].keys():
(src_vm, dst_vm) = key
for key2 in sorted(cmds[qrouter][key].keys()):
(src_ip, dst_ip) = key2
result = cmds[qrouter][key][key2]['pass']
if not result:
qrouter_result = False
break # check the next namsepace, this one failed
# if all ping passed via this qrouter, return true
if qrouter_result:
return qrouter_result
# There was no qrouter via which all pings passed!
return qrouter_result
def run_ping_command(cmd, comment=''):
debug('Running ' + comment + ': ' + cmd)
return subprocess.check_output(cmd,
shell=True,
stderr=subprocess.STDOUT,
universal_newlines=True).replace('\t', ' ')
def report_file_open(report_file):
f = open(report_file, 'w')
f.write('<html>\n')
f.write('<head>\n')
f.write(
'<script type="text/javascript" src="{{ STATIC_URL }}/don/CollapsibleLists.js"></script>\n')
f.write(
'<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}/don/don.css">\n')
f.write('<title>DON: Analysis Results</title>\n')
f.write('</head>\n')
f.write('<body onload=CollapsibleLists.apply()>\n')
return f
def report_file_close(file_handle):
file_handle.write('</body>\n')
file_handle.write('</html>\n')
def print_ping_result(cmds, overall_result, info, comment=None):
lines = []
lines.append('<h2>Ping Test Results</h2>\n')
if comment:
lines.append('<h3>%s</h3>\n' % comment)
lines.append('<ul class="collapsibleList">\n')
for qrouter in sorted(cmds.keys()):
router = get_router(qrouter, info)
lines.append(' <li>%s (Namespace [%s])\n' % (router, qrouter))
lines.append(' <ul class="collapsibleList">\n')
for key in sorted(cmds[qrouter].keys()):
(src_vm, dst_vm) = key
lines.append(' <li>%s &rarr; %s\n' % (src_vm, dst_vm))
lines.append(' <ul class="collapsibleList">\n')
for key2 in sorted(cmds[qrouter][key].keys()):
(src_ip, dst_ip) = key2
result = cmds[qrouter][key][key2]['pass']
result_str = '<font class="fail">%s</font>' % cross
if result:
result_str = '<font class="pass">%s</font>' % tick
lines.append(' <li>%15s &rarr; %15s %s\n' %
(src_ip, dst_ip, result_str))
lines.append(' <ul class="collapsibleList">\n')
if result:
lines.append(' <pre class="pass">\n')
else:
lines.append(' <pre class="fail">\n')
for line in cmds[qrouter][key][key2]['output'].split('\n'):
lines.append(line + '\n')
lines.append(' </pre>\n')
lines.append(' </ul>\n')
lines.append(' </li>\n')
lines.append(' </ul>\n')
lines.append(' </li>\n')
lines.append(' </ul>\n')
lines.append(' </li>\n')
lines.append('</ul>\n')
overall_str = '<font class="fail">%s</font>' % cross
if overall_result:
overall_str = '<font class="pass">%s</font>' % tick
lines.append('OVERALL RESULT: %s\n' % overall_str)
return lines
def get_vm_credentials(config_file='credentials.yaml'):
try:
with open(config_file, 'r') as s:
return yaml.safe_load(s)
except IOError, e:
print '%s :%s' % (e.args[1], config_file)
raise
def test_ping(info):
debug('Running ping test')
vms = info['vms']
vm_credentials = get_vm_credentials()
for vm in sorted(vms.keys()):
vms[vm]['qrouter'] = get_vm_qrouters(info, vm)
vm_pairs = list(combinations(sorted(vms.keys()), 2))
pprint.pprint(vm_pairs)
cmds = {}
for (src_vm, dst_vm) in vm_pairs:
for qrouter in vms[src_vm]['qrouter']:
debug(qrouter)
if not cmds.has_key(qrouter):
cmds[qrouter] = {}
cmds[qrouter][(src_vm, dst_vm)] = {}
for src_ip in vms[src_vm]['interfaces'].keys():
if is_network_public(src_ip, src_vm, info):
continue
for dst_ip in vms[dst_vm]['interfaces'].keys():
if is_network_public(dst_ip, dst_vm, info):
continue
username = vm_credentials.get(
src_vm, vm_credentials['default'])['username']
passwd = vm_credentials.get(src_vm, vm_credentials[
'default'])['password']
cmd = 'sudo ip netns exec ' + qrouter
cmd += ' python ping.py --src_ip %s --dst_ip %s --username "%s" --passwd "%s" --count %d --timeout %d' % \
(src_ip, dst_ip, username, passwd, 1, 2)
comment = 'Ping [%s (%s) => %s (%s)]' % (
src_vm, src_ip, dst_vm, dst_ip)
output = run_ping_command(cmd, comment=comment)
a = json.loads(output)
success = a['pass']
cmds[qrouter][(src_vm, dst_vm)][(src_ip, dst_ip)] = {
'cmd': cmd,
'output': output,
'pass': success
}
debug(pprint.pformat(cmds))
ping_test_passed = did_ping_test_pass(cmds)
return (ping_test_passed, cmds)
def run_ovs_command(cmd, comment=''):
debug('Running ' + comment + ': ' + cmd)
return subprocess.check_output(cmd,
shell=True,
stderr=subprocess.STDOUT,
universal_newlines=True).replace('\t', ' ')
def process_ovs_output(output):
for line in output:
if re.search('PASS', line):
return True
return False
def print_ovs_result(cmds, overall_result, info, comment=None):
lines = []
lines.append('<h2>OVS Test Results</h2>\n')
if comment:
lines.append('<h3>%s</h3>\n' % comment)
lines.append('<ul class="collapsibleList">\n')
lines.append(' <li>OVS bridge br-int\n')
lines.append(' <ul class="collapsibleList">\n')
for tag in sorted(cmds.keys()):
lines.append(' <li>tag %s\n' % (tag))
lines.append(' <ul class="collapsibleList">\n')
for key in sorted(cmds[tag].keys()):
(src_port, dst_port) = key
result = cmds[tag][key]['pass']
result_str = '<font class="fail">%s</font>' % cross
if result:
result_str = '<font class="pass">%s</font>' % tick
lines.append(' <li>%3s &rarr; %3s %s\n' %
(src_port, dst_port, result_str))
lines.append(' <ul class="collapsibleList">\n')
if result:
lines.append(' <pre class="pass">\n')
else:
lines.append(' <pre class="fail">\n')
for line in cmds[tag][key]['output'].split('\n'):
lines.append(line + '\n')
lines.append(' </ul>\n')
lines.append(' </li>\n')
lines.append(' </ul>\n')
lines.append(' </li>\n')
lines.append(' </ul>\n')
lines.append(' </li>\n')
lines.append('</ul>\n')
overall_str = '<font class="fail">%s</font>' % cross
if overall_result:
overall_str = '<font class="pass">%s</font>' % tick
lines.append('OVERALL RESULT: %s\n' % overall_str)
return lines
def test_ovs(info):
debug('Running OVS test')
ovs_test_passed = True
cmds = {}
# first construct a dictionary of tag to br-int ports
br_int_ports = info['bridges']['br-int']['ports']
tag_to_port = {}
for port in br_int_ports.keys():
if not re.search('^qvo', port):
continue
tag = br_int_ports[port]['tag']
port_id = br_int_ports[port]['id']
if not tag_to_port.has_key(tag):
tag_to_port[tag] = []
tag_to_port[tag].append((port_id, port))
debug(pprint.pformat(tag_to_port))
for tag in sorted(tag_to_port.keys(), key=lambda x: int(x)):
cmds[tag] = {}
port_count = len(tag_to_port[tag])
if port_count < 2:
debug('tag %s is used by single port %s. Skipping test!' %
(tag, tag_to_port[tag][0]))
continue
port_list = list(map(lambda (x, y): x, tag_to_port[tag]))
sorted_port_list = sorted(port_list, key=lambda x: int(x))
port_pairs = list(combinations(sorted_port_list, 2))
for (src_port, dst_port) in port_pairs:
cmds[tag][(src_port, dst_port)] = {}
cmd = ''
cmd += 'python ovs.py --src_port_id %s --dst_port_id %s --tag %s --ovs_bridge br-int' % \
(src_port, dst_port, tag)
comment = 'ovs [tag: %s port %s => %s' % (tag, src_port, dst_port)
output = run_ovs_command(cmd, comment=comment)
success = process_ovs_output(output)
if not success:
ovs_test_passed = False
cmds[tag][(src_port, dst_port)] = {
'cmd': cmd,
'output': output,
'pass': success
}
return (ovs_test_passed, cmds)
# Dictionary of tests
test_suite = {
'ping': {
'help': 'Ping test between all pairs of VMs',
'func': test_ping,
'result': 'not run',
'formatter': print_ping_result,
'html': None,
},
'ovs': {
'help': 'OVS test between all pairs of ports using the same tag in br-int',
'func': test_ovs,
'result': 'not run',
'formatter': print_ovs_result,
'html': None,
},
}
def analyze(json_filename, params):
settings['debug'] = True
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
CUR_DIR = os.getcwd()
os.chdir(BASE_DIR + '/ovs')
# NEW_DIR = os.getcwd()
# return BASE_DIR + ':' + CUR_DIR + ':' + NEW_DIR
debug('This is what I am going to analyze')
my_info = load_json(json_filename)
for test in test_suite.keys():
flag = 'test:' + test
if params[flag] or params['test:all']:
(result, cmds) = test_suite[test]['func'](my_info)
if result:
test_suite[test]['result'] = 'PASS'
else:
test_suite[test]['result'] = 'FAIL'
lines = test_suite[test]['formatter'](cmds,
result,
my_info,
test_suite[test]['help'])
test_suite[test]['html'] = lines
debug(params['test:report_file'])
f = report_file_open(params['test:report_file'])
for test in test_suite.keys():
if test_suite[test]['html']:
for line in test_suite[test]['html']:
f.write(line)
report_file_close(f)
os.chdir(CUR_DIR)
def check_args():
parser = argparse.ArgumentParser(description='Static analysis of output of commands',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('--debug', dest='debug',
help='Enable debugging',
default=True, action='store_true')
parser.add_argument('--info_file', dest='info_file',
help='Info is read in JSON format in this file',
default="don.json", type=str)
parser.add_argument('--ping', dest='ping',
help='ping test between all VMs', default=False,
action='store_true')
parser.add_argument('--ping_count', dest='ping_count',
help='how many ping packets to send',
default=2, type=int)
parser.add_argument('--ping_timeout', dest='ping_timeout',
help='ping timeout period in seconds',
default=2, type=int)
parser.add_argument('--ovs', dest='ovs',
help='ovs test between ports using same tag in br-int',
default=False, action='store_true')
parser.add_argument('--test_all', dest='test_all',
help='Perform all tests in test suite',
default=False, action='store_true')
parser.add_argument('--error_file', dest='error_file',
help='All errors will be reported to this file',
type=str, default='don.error.txt')
parser.add_argument('--report_file', dest='report_file',
help='Report will be written in this file in HTML format',
type=str, default='don.report.html')
args = parser.parse_args()
settings['debug'] = args.debug
settings['info_file'] = args.info_file
settings['error_file'] = args.error_file
settings['test:all'] = args.test_all
settings['test:ping'] = args.test_all or args.ping
settings['test:ping_count'] = args.ping_count
settings['test:ping_timeout'] = args.ping_timeout
settings['test:ovs'] = args.test_all or args.ovs
settings['test:report_file'] = args.report_file
def main():
check_args()
analyze(settings['info_file'], settings)
pprint.pprint(test_suite)
if __name__ == "__main__":
main()

View File

@ -0,0 +1,965 @@
#
# This file runs a whole bunch of commands (on the shell), parses their outputs
# and constructs a dictionary of extracted information.
#
import pprint
import re
import argparse
import os
from common import settings, debug, error, status_update, dump_json
from common import execute_cmd, connect_to_box, get_vm_credentials
import ConfigParser
# from analyzer import analyze
don_config = ConfigParser.ConfigParser()
try:
don_config.read('/etc/don/don.conf')
except Exception, e:
print e
deployment_type = don_config.get('DEFAULT', 'deployment_type')
def get_env(filename):
try:
lines = open(os.getcwd() + os.sep + filename, 'r').read().splitlines()
except IOError, e:
print "%s :%s" % (e.args[1], filename)
raise
env = {}
for line in lines:
if line.startswith('export'):
m = re.search(r'export (.+)=(.+)', line)
if m:
key = m.group(1).replace('"', '')
val = m.group(2).replace('"', '')
env.update({key: val})
return env
myenv = os.environ.copy()
myenv.update(get_env('admin-openrc.sh'))
# Contains all info gathered by parsing the output of commands
info = {
'vms': {},
'brctl': {},
'bridges': {
'br-ex': {'ports': {}},
'br-int': {'ports': {}},
'br-tun': {'ports': {}}
},
'floating_ips': {},
}
def add_new_command(cmd_dict, cmd_key, cmd):
if cmd_dict.has_key(cmd_key):
error(cmd_key + ' already exists in command dictionary')
return
cmd_dict[cmd_key] = cmd
def record_linuxbridge(bridge, interface_list):
brctl_dict = info['brctl']
if brctl_dict.has_key(bridge):
error('Bridge ' + bridge + ' repeated! Overwriting!')
brctl_dict[bridge] = {'interfaces': interface_list}
def get_bridge_entry(br):
bridge_dict = info['bridges']
if not bridge_dict.has_key(br):
error('Bridge ' + br + ' does not exist! Supported bridges: ' +
str(bridge_dict.keys()))
return None
return bridge_dict.get(br)
#
# Parser functions (for each command). Each function has the sample input
# as a comment above it.
#
'''
<uuid>31b1cfcc-ca85-48a9-a84a-8b222d377080</uuid>
<nova:name>VM1</nova:name>
<source bridge='qbrb0f5cfc8-4d'/>
<uuid>f9743f1c-caeb-4892-af83-9dc0ac757545</uuid>
<nova:name>VM2</nova:name>
<source bridge='qbr6ce314cb-a5'/>
'''
def cat_instance_parser(parse_this):
vm_dict = info['vms']
uuid = None
name = None
src_bridge = None
for line in parse_this:
m = re.search('<uuid>(\S+)</uuid>', line)
if m:
uuid = m.group(1)
continue
m = re.search('<nova:name>(\S+)</nova:name>', line)
if m:
name = m.group(1)
continue
m = re.search('<source bridge=\'(\S+)\'/>', line)
if m:
src_bridge = m.group(1)
if not vm_dict.has_key(name):
vm_dict[name] = {}
vm_entry = vm_dict[name]
vm_entry['uuid'] = uuid
if not vm_entry.has_key('src_bridge'):
vm_entry['src_bridge'] = []
vm_entry['tap_dev'] = []
vm_entry['src_bridge'].append(src_bridge)
vm_entry['tap_dev'].append(src_bridge.replace('qbr', 'tap'))
'''
bridge name bridge id STP enabled interfaces
qbr6ce314cb-a5 8000.9255d5550cf8 no qvb6ce314cb-a5
tap6ce314cb-a5
qbrb0f5cfc8-4d 8000.b2277f2c981b no qvbb0f5cfc8-4d
tapb0f5cfc8-4d
virbr0 8000.000000000000 yes
'''
def brctl_show_parser(parse_this):
interfaces = []
bridge = None
for line in parse_this:
m = re.search('(qbr\S+)\s+\S+\s+\S+\s+(\S+)', line)
if m:
# We already have a bridge, that means we are now lookign at the
# next bridge
if bridge:
record_linuxbridge(bridge, interfaces)
interfaces = []
bridge = m.group(1)
interfaces.append(m.group(2))
continue
m = re.search('^\s+(\S+)', line)
if m:
interfaces.append(m.group(1))
# handle the last bridge
if bridge:
record_linuxbridge(bridge, interfaces)
'''
ubuntu@ubuntu-VirtualBox:~/don$ sudo ovs-vsctl show
0fc4d93f-28e0-408a-8edb-21d5ec76b2c3
Bridge br-tun
fail_mode: secure
Port patch-int
Interface patch-int
type: patch
options: {peer=patch-tun}
Port br-tun
Interface br-tun
type: internal
Bridge br-int
fail_mode: secure
Port "tap3b74b285-71"
tag: 2
Interface "tap3b74b285-71"
type: internal
Port patch-tun
Interface patch-tun
type: patch
options: {peer=patch-int}
Port "qvob0f5cfc8-4d"
tag: 2
Interface "qvob0f5cfc8-4d"
Port "qr-77ce7d4c-d5"
tag: 1
Interface "qr-77ce7d4c-d5"
type: internal
Port "qr-56cf8a2d-27"
tag: 2
Interface "qr-56cf8a2d-27"
type: internal
Port "qvo6ce314cb-a5"
tag: 2
Interface "qvo6ce314cb-a5"
Port br-int
Interface br-int
type: internal
Port "tap9d44135a-45"
tag: 1
Interface "tap9d44135a-45"
type: internal
Bridge br-ex
Port "qg-2909632b-b8"
Interface "qg-2909632b-b8"
type: internal
Port br-ex
Interface br-ex
type: internal
Port "qg-e2fb759b-60"
Interface "qg-e2fb759b-60"
type: internal
ovs_version: "2.0.2"
'''
def ovs_vsctl_show_parser(parse_this):
bridge = None
bridge_dict = info['bridges']
for line in parse_this:
m = re.search('Bridge\s+(br-\S+)', line)
if m:
bridge = str(m.group(1))
if not bridge_dict.has_key(bridge):
error(
'Skipping bridge [' + bridge + ']! Supported bridges: ' +
str(bridge_dict.keys()))
bridge = None
continue
bridge_entry = bridge_dict.get(bridge)
if bridge:
m = re.search('fail_mode: (\S+)', line)
if m:
bridge_entry['fail_mode'] = m.group(1)
continue
m = re.search('Port (\S+)', line)
if m:
# the port names seem to have double quotes around them!
port = m.group(1).replace('"', '')
if not bridge_entry['ports'].has_key(port):
bridge_entry['ports'][port] = {}
port_entry = bridge_entry['ports'][port]
continue
m = re.search('tag: (\d+)', line)
if m:
port_entry['tag'] = m.group(1)
continue
m = re.search('Interface (\S+)', line)
if m:
# the interface names seem to have double quotes around them!
interface = m.group(1).replace('"', '')
if not port_entry.has_key('interfaces'):
port_entry['interfaces'] = {}
port_entry['interfaces'][interface] = {}
interface_entry = port_entry['interfaces'][interface]
continue
m = re.search('type: (\S+)', line)
if m:
interface_entry['type'] = m.group(1)
continue
m = re.search('options: {(\S+)}', line)
if m:
options = m.group(1)
interface_entry['options'] = options
continue
'''
OFPT_FEATURES_REPLY (xid=0x2): dpid:00008207ee8eee4d
n_tables:254, n_buffers:256
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: OUTPUT SET_VLAN_VID SET_VLAN_PCP STRIP_VLAN SET_DL_SRC SET_DL_DST \
SET_NW_SRC SET_NW_DST SET_NW_TOS SET_TP_SRC SET_TP_DST ENQUEUE
4(patch-tun): addr:e2:ce:31:60:94:e0
config: 0
state: 0
speed: 0 Mbps now, 0 Mbps max
5(tap9d44135a-45): addr:00:00:00:00:00:00
config: PORT_DOWN
state: LINK_DOWN
speed: 0 Mbps now, 0 Mbps max
6(qr-77ce7d4c-d5): addr:00:00:00:00:00:00
config: PORT_DOWN
state: LINK_DOWN
speed: 0 Mbps now, 0 Mbps max
7(tap3b74b285-71): addr:00:00:00:00:00:00
config: PORT_DOWN
state: LINK_DOWN
speed: 0 Mbps now, 0 Mbps max
8(qr-56cf8a2d-27): addr:00:00:00:00:00:00
config: PORT_DOWN
state: LINK_DOWN
speed: 0 Mbps now, 0 Mbps max
9(qvob0f5cfc8-4d): addr:7a:82:4f:4e:a0:ab
config: 0
state: 0
current: 10GB-FD COPPER
speed: 10000 Mbps now, 0 Mbps max
10(qvo6ce314cb-a5): addr:42:92:2a:95:28:ed
config: 0
state: 0
current: 10GB-FD COPPER
speed: 10000 Mbps now, 0 Mbps max
LOCAL(br-int): addr:82:07:ee:8e:ee:4d
config: 0
state: 0
speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0
'''
def ovs_ofctl_show_br_parser(bridge, parse_this):
bridge_dict = info['bridges']
if not bridge_dict.has_key(bridge):
error('Skipping bridge [' + bridge +
']! Supported bridges: ' + str(bridge_dict.keys()))
return
bridge_entry = bridge_dict.get(bridge)
pprint.pprint(bridge_entry)
for line in parse_this:
m = re.search('(\d+)\((\S+)\):\s+addr:(\S+)', line)
if m:
port_id = m.group(1)
port = m.group(2)
port_mac = m.group(3)
if not bridge_entry['ports'].has_key(port):
bridge_entry['ports'][port] = {}
port_entry = bridge_entry['ports'][port]
port_entry['id'] = port_id
port_entry['mac'] = port_mac
continue
m = re.search('(\w+)\((\S+)\):\s+addr:(\S+)', line)
if m:
port_id = m.group(1)
port = m.group(2)
port_mac = m.group(3)
if not bridge_entry['ports'].has_key(port):
bridge_entry['ports'][port] = {}
port_entry = bridge_entry['ports'][port]
port_entry['id'] = port_id
port_entry['mac'] = port_mac
pass
# These three are all wrappers for each of the three bridges
def ovs_ofctl_show_br_int_parser(parse_this):
ovs_ofctl_show_br_parser('br-int', parse_this)
def ovs_ofctl_show_br_ex_parser(parse_this):
ovs_ofctl_show_br_parser('br-ex', parse_this)
def ovs_ofctl_show_br_tun_parser(parse_this):
ovs_ofctl_show_br_parser('br-tun', parse_this)
'''
+--------------------------------------+-------+--------+------------+-------------+--------------------------------------------------------+
| ID | Name | Status | Task State | Power State | Networks |
+--------------------------------------+-------+--------+------------+-------------+--------------------------------------------------------+
| 31b1cfcc-ca85-48a9-a84a-8b222d377080 | VM1 | ACTIVE | - | Running | private=10.0.2.3 |
| f9743f1c-caeb-4892-af83-9dc0ac757545 | VM2 | ACTIVE | - | Running | private=10.0.2.4 |
| 83b547b9-9578-4840-997a-5aa1c4e829b0 | VM3-1 | ACTIVE | - | Running | private2=10.0.3.3 |
| 17b4685e-5cbe-4dd1-862a-6f89c191e1e7 | VM3-2 | ACTIVE | - | Running | private2=10.0.3.4 |
| ee4952a3-0700-42ea-aab3-7503bc9d87e2 | VM4 | ACTIVE | - | Running | private2=10.0.3.5; public=172.24.4.4; private=10.0.2.5 |
+--------------------------------------+-------+--------+------------+-------------+--------------------------------------------------------+
'''
def nova_list_parser(parse_this):
vm_dict = info['vms']
for line in parse_this:
if re.search('^\+', line) or re.search('^$', line) or \
re.search('Networks', line):
continue
parts = line.split('|')
parts = [x.strip() for x in parts]
vm = parts[2]
networks = parts[6].split(';')
networks = [x.strip() for x in networks]
if not vm_dict.has_key(vm):
vm_dict[vm] = {'interfaces': {}}
for entry in networks:
# excluding ipv6 ip
if len(entry.split(',')) > 1:
network = entry.split('=')[0]
ip = filter(lambda a: re.search("(\d+\.\d+\.\d+\.\d+)", a) is not
None, entry.split('=')[1].split(','))[0].strip()
else:
(network, ip) = entry.split(',')[0].split('=')
vm_dict[vm]['interfaces'][ip] = {'network': network}
pass
'''
+--------------------------------------+------+-------------------+-----------------------------------------------------------------------------------+
| id | name | mac_address | fixed_ips |
+--------------------------------------+------+-------------------+-----------------------------------------------------------------------------------+
| 1dd820b1-98bd-4f39-b1ab-e89ecc67ae43 | | fa:16:3e:0f:36:26 | {"subnet_id": "75ae4ce8-495d-4f53-93d1-bf98e55d6658", "ip_address": "172.24.4.4"} |
| 1f73af79-fa69-4433-bcab-16d7a0bc2607 | | fa:16:3e:dc:c8:de | {"subnet_id": "dbc9717f-5a08-48bb-92e2-ed2da443541b", "ip_address": "10.0.3.1"} |
| 2909632b-b8a3-436b-aabd-9868d0c1051e | | fa:16:3e:af:95:a9 | {"subnet_id": "75ae4ce8-495d-4f53-93d1-bf98e55d6658", "ip_address": "172.24.4.2"} |
| 3b74b285-71d0-4311-8a69-2b032eebbe13 | | fa:16:3e:70:09:45 | {"subnet_id": "1083b740-45ce-49be-b603-73cbc26af5d7", "ip_address": "10.0.2.2"} |
| 56cf8a2d-27b7-4eab-a334-349c70520868 | | fa:16:3e:8a:ce:cb | {"subnet_id": "1083b740-45ce-49be-b603-73cbc26af5d7", "ip_address": "10.0.2.1"} |
| 6ce314cb-a599-4af8-8187-bdb0bfa88809 | | fa:16:3e:83:b1:60 | {"subnet_id": "1083b740-45ce-49be-b603-73cbc26af5d7", "ip_address": "10.0.2.4"} |
| 77ce7d4c-d5b9-4669-b23c-b0d9ee5f58c8 | | fa:16:3e:a6:de:15 | {"subnet_id": "531f1674-2b46-4ad7-9d73-4c41d215cc99", "ip_address": "10.0.0.1"} |
| 9c34adc0-c655-4b00-89ba-ca65def56fe0 | | fa:16:3e:a1:e7:f5 | {"subnet_id": "dbc9717f-5a08-48bb-92e2-ed2da443541b", "ip_address": "10.0.3.4"} |
| 9d44135a-4551-4448-9c80-d211b023c3eb | | fa:16:3e:80:83:c9 | {"subnet_id": "531f1674-2b46-4ad7-9d73-4c41d215cc99", "ip_address": "10.0.0.2"} |
| b0f5cfc8-4da0-42ad-8c18-6f29870bfb2a | | fa:16:3e:ae:a2:17 | {"subnet_id": "1083b740-45ce-49be-b603-73cbc26af5d7", "ip_address": "10.0.2.3"} |
| c03437a8-8a44-4615-b160-e1ef227d63c5 | | fa:16:3e:7f:b6:a5 | {"subnet_id": "dbc9717f-5a08-48bb-92e2-ed2da443541b", "ip_address": "10.0.3.5"} |
| cb7d8a29-8140-4ed0-a1c7-03cbf0be0c5b | | fa:16:3e:33:ee:b1 | {"subnet_id": "1083b740-45ce-49be-b603-73cbc26af5d7", "ip_address": "10.0.2.5"} |
| e2fb759b-602a-4fcd-8674-e8f5fe297dbc | | fa:16:3e:ea:47:b5 | {"subnet_id": "75ae4ce8-495d-4f53-93d1-bf98e55d6658", "ip_address": "172.24.4.3"} |
| e4f25d71-5684-4ccc-8114-2465a84ecc58 | | fa:16:3e:90:c7:d3 | {"subnet_id": "dbc9717f-5a08-48bb-92e2-ed2da443541b", "ip_address": "10.0.3.2"} |
| f57aa80e-2ef3-4031-a0a4-bc12d2445687 | | fa:16:3e:2e:6e:91 | {"subnet_id": "dbc9717f-5a08-48bb-92e2-ed2da443541b", "ip_address": "10.0.3.3"} |
+--------------------------------------+------+-------------------+-----------------------------------------------------------------------------------+
'''
def neutron_port_list_parser(parse_this):
tap_to_ip = {}
for line in parse_this:
if re.search('^\+', line) or re.search('^$', line) or \
re.search('fixed_ips', line):
continue
parts = line.split('|')
parts = [x.strip() for x in parts]
tap = parts[1][:11]
# ip = parts[4].split(':')[-1].replace('}', '')
m = re.search('"ip_address": "(\S+)"', parts[4])
if m:
ip = m.group(1)
tap_to_ip[tap] = ip
info['tap_to_ip'] = tap_to_ip
pass
'''
+--------------------------------------+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+-------+
| id | name | external_gateway_info | distributed | ha |
+--------------------------------------+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+-------+
| 8c981cdb-c19f-47c1-8149-f85a506c486c | router1 | {"network_id": "640ece56-c6dc-4868-8e7a-12547508098a", "enable_snat": true, "external_fixed_ips": [{"subnet_id": "75ae4ce8-495d-4f53-93d1-bf98e55d6658", "ip_address": "172.24.4.2"}]} | False | False |
| ac41aab2-f9c3-4a06-8eef-f909ee1e6e50 | router | {"network_id": "640ece56-c6dc-4868-8e7a-12547508098a", "enable_snat": true, "external_fixed_ips": [{"subnet_id": "75ae4ce8-495d-4f53-93d1-bf98e55d6658", "ip_address": "172.24.4.3"}]} | False | False |
+--------------------------------------+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+-------+
'''
def neutron_router_list_parser(parse_this):
routers = {}
for line in parse_this:
if re.search('^\+', line) or re.search('^$', line) or \
re.search('external_gateway_info', line):
continue
parts = line.split('|')
parts = [x.strip() for x in parts]
router_id = parts[1]
name = parts[2]
network_id = 'unknown'
m = re.search('"network_id":\s+"(\S+)"', parts[3])
if m:
network_id = m.group(1)
ip_address = 'x.x.x.x'
m = re.search('"ip_address":\s+"(\d+\.\d+\.\d+\.\d+)"', parts[3])
if m:
ip_address = m.group(1)
routers[name] = {'id': router_id,
'ip_address': ip_address,
'network_id': network_id,
}
info['routers'] = routers
# now add some more commands to get further information for
# l3-agents which run in different namespaces
for router in info['routers'].keys():
uuid = info['routers'][router]['id']
namespace = 'qrouter-' + uuid
cmd_key = 'netns_' + namespace
cmd = {
'cmd': 'echo namespace: ' + namespace + '; echo "sudo ip netns exec ' + namespace + ' ip a" > /tmp/don.bash; bash /tmp/don.bash',
'help': 'Collect namespace info for l3-agent',
'shell': True,
'output': None,
'order': 100,
'parser': ip_namespace_qrouter_parser,
}
add_new_command(commands, cmd_key, cmd)
pass
def ip_namespace_qrouter_parser(parse_this):
nm_dict = info['namespaces']
qr_intf = None
qg_intf = None
ip = None
for line in parse_this:
if re.search('^\+', line) or re.search('^$', line):
continue
m = re.search('^namespace: (\S+)', line)
if m:
namespace = m.group(1)
continue
m = re.search('^\d+: (qr-\S+):', line)
if m:
qr_intf = m.group(1)
continue
m = re.search('^\d+: (qg-\S+):', line)
if m:
qg_intf = m.group(1)
continue
m = re.search('inet (\d+\.\d+\.\d+\.\d+/\d+)', line)
if m:
ip = m.group(1)
if not nm_dict[namespace].has_key('interfaces'):
nm_dict[namespace] = {'interfaces': {}}
if qg_intf:
nm_dict[namespace]['interfaces'][qg_intf] = ip
elif qr_intf:
nm_dict[namespace]['interfaces'][qr_intf] = ip
else:
continue
qr_intf = None
qg_intf = None
ip = None
pass
def ip_namespace_qdhcp_parser(parse_this):
nm_dict = info['namespaces']
tap_intf = None
ip = None
for line in parse_this:
if re.search('^\+', line) or re.search('^$', line):
continue
m = re.search('^namespace: (\S+)', line)
if m:
namespace = m.group(1)
continue
m = re.search('^\d+: (tap\S+):', line)
if m:
tap_intf = m.group(1)
m = re.search('inet (\d+\.\d+\.\d+\.\d+/\d+)', line)
if m:
ip = m.group(1)
if not nm_dict[namespace].has_key('interfaces'):
nm_dict[namespace] = {'interfaces': {}}
if tap_intf:
nm_dict[namespace]['interfaces'][tap_intf] = ip
tap_intf = None
ip = None
pass
'''
+--------------------------------------+----------+----------------------------------------------------------+
| id | name | subnets |
+--------------------------------------+----------+----------------------------------------------------------+
| 0a355cf0-00d0-45e1-9a3a-9aca436510d5 | private2 | 8393a2da-09dd-46e8-a26f-caf9f12c48f5 10.0.3.0/24 |
| 3b4ddfcb-49b8-46ae-9ecd-cb4f9b1830fc | public | 2dd78cb6-eb90-44ea-82b0-bbdb7316edb2 172.24.4.0/24 |
| | | 304ce342-18fe-4b4a-aa49-f5c7e5e31b2a 2001:db8::/64 |
| 4b7a42e8-cc16-411c-b932-989106c2f934 | private1 | cc580da4-0b61-4982-ae7b-d2d5c441b1d7 10.0.2.0/24 |
| bfedebe8-c436-4056-8d12-1d2f7e62e8ec | private | 4deed2ad-e184-43a9-8cc7-4493aa07f78f fdfd:57f1:b2ba::/64 |
| | | 8e2c5cfd-fbc1-4fe0-9f5e-f0b0dc070fb8 10.0.0.0/24 |
+--------------------------------------+----------+----------------------------------------------------------+
'''
def neutron_net_list_parser(parse_this):
networks = {}
ip = 'unknown'
for line in parse_this:
if re.search('^\+', line) or re.search('^$', line) or re.search('subnets', line):
continue
# Skip IPv6 for the time being
m = re.search('^\| (\S+) \| (\S+)\s+\| \S+ (\S+)', line)
if m:
network_id = m.group(1)
name = m.group(2)
possible_ip = m.group(3)
if re.search('\.', possible_ip):
ip = possible_ip
networks[network_id] = {'name': name,
'ip': ip
}
m = re.search('^\|\s+\|\s+\| \S+ (\S+)', line)
if m:
possible_ip = m.group(1)
if re.search('\.', possible_ip):
ip = possible_ip
networks[network_id] = {'name': name,
'ip': ip
}
ip = 'Unknown'
info['networks'] = networks
# now add some more commands to get further information for
# dhcp agents which run in different namespaces
for network_id in networks.keys():
# There is no dhcp agent run for public network
if networks[network_id]['name'] == 'public':
continue
namespace = 'qdhcp-' + network_id
cmd_key = 'netns_' + namespace
cmd = {
'cmd': 'echo namespace: ' + namespace + '; echo "sudo ip netns exec ' + namespace + ' ip a" > /tmp/don.bash; bash /tmp/don.bash',
'help': 'Collect namespace info for dhcp-agent',
'shell': True,
'output': None,
'order': 110,
'parser': ip_namespace_qdhcp_parser,
}
add_new_command(commands, cmd_key, cmd)
pass
'''
qdhcp-d5357ad8-df8b-4f19-8433-9db13304e4b2
qrouter-ac41aab2-f9c3-4a06-8eef-f909ee1e6e50
qdhcp-49be53de-33ed-480a-a06e-6e77c8f887dc
qrouter-8c981cdb-c19f-47c1-8149-f85a506c486c
qdhcp-82b0e328-4530-495e-a43f-238ef7a53d62
'''
def ip_netns_parser(parse_this):
namespaces = {}
for line in parse_this:
if re.search('^q', line):
namespaces[line] = {}
info['namespaces'] = namespaces
def dummy_parser(parse_this):
debug('Dummy Parser :-)')
pass
def floating_ip_list_parser(parse_this):
floating_ips = {}
for line in parse_this:
if re.search('^\+', line) or re.search('^$', line) or re.search('Pool', line):
continue
parts = line.split('|')
parts = [x.strip() for x in parts]
floating_ip = parts[2]
vm_id = parts[3]
pool = parts[5]
# ignore floating ips which is not assigned to any vms
if vm_id != '-':
floating_ips.update(
{vm_id: {'floating_ip': floating_ip, 'pool': pool}})
info['floating_ips'] = floating_ips
# static commands whose output have info that help us diagnose
commands = {
'nova_list':
{
'cmd': ['nova', 'list'],
'help': 'Collect list of VMs from nova',
'env': True,
'output': None,
'order': 1,
'parser': nova_list_parser,
},
'cat_instance':
{
'cmd': 'cat /etc/libvirt/qemu/instance-*.xml | egrep -e "<uuid>" -e "nova:name" -e "source bridge"',
'help': 'Collect some info from the launched VMs',
'sudo': True,
'shell': True,
'output': None,
'order': 2,
'parser': cat_instance_parser,
},
'neutron_port_list':
{
'cmd': ['neutron', 'port-list'],
'help': 'Collect neutron configured ports',
'env': True,
'output': None,
'order': 3,
'parser': neutron_port_list_parser,
},
'neutron_router_list':
{
'cmd': ['neutron', 'router-list'],
'help': 'Collect neutron configured routers',
'env': True,
'output': None,
'order': 4,
'parser': neutron_router_list_parser,
},
'neutron_net_list':
{
'cmd': ['neutron', 'net-list'],
'help': 'Collect neutron configured networks',
'env': True,
'output': None,
'order': 5,
'parser': neutron_net_list_parser,
},
'ip_netns':
{
'cmd': ['ip', 'netns'],
'help': 'Collect network namespaces',
'output': None,
'order': 6,
'parser': ip_netns_parser,
},
'brctl_show':
{
'cmd': ['brctl', 'show'],
'help': 'Collect information about bridges (linuxbridge) configured',
'output': None,
'order': 10,
'parser': brctl_show_parser,
},
'ovs_appctl_fdb_show_br_ex':
{
'cmd': ['ovs-appctl', 'fdb/show', 'br-ex'],
'help': 'Collect mac data base for bridge br-ex',
'sudo': True,
'output': None,
'order': 20,
'parser': None,
},
'ovs_appctl_fdb_show_br_int':
{
'cmd': ['ovs-appctl', 'fdb/show', 'br-int'],
'help': 'Collect mac data base for ovs bridge br-int',
'sudo': True,
'output': None,
'order': 21,
'parser': None,
},
'ovs_appctl_fdb_show_br_tun':
{
'cmd': ['ovs-appctl', 'fdb/show', 'br-tun'],
'help': 'Collect mac data base for ovs bridge br-tun',
'sudo': True,
'output': None,
'order': 22,
'parser': None,
},
'ovs_vsctl_show':
{
'cmd': ['ovs-vsctl', 'show'],
'help': 'Collect ovs bridge info',
'sudo': True,
'output': None,
'order': 30,
'parser': ovs_vsctl_show_parser,
},
'ovs_ofctl_show_br_ex':
{
'cmd': ['ovs-ofctl', 'show', 'br-ex'],
'help': 'Collect openflow information for ovs bridge br-ex',
'sudo': True,
'output': None,
'order': 40,
'parser': ovs_ofctl_show_br_ex_parser,
},
'ovs_ofctl_show_br_int':
{
'cmd': ['ovs-ofctl', 'show', 'br-int'],
'help': 'Collect openflow information for ovs bridge br-int',
'sudo': True,
'output': None,
'order': 41,
'parser': ovs_ofctl_show_br_int_parser,
},
'ovs_ofctl_show_br_tun':
{
'cmd': ['ovs-ofctl', 'show', 'br-tun'],
'help': 'Collect openflow information for ovs bridge br-tun',
'sudo': True,
'output': None,
'order': 42,
'parser': ovs_ofctl_show_br_tun_parser,
},
'ovs_ofctl_dump_flows_br_ex':
{
'cmd': ['ovs-ofctl', 'dump-flows', 'br-ex'],
'help': 'Collect openflow flow table information for ovs bridge br-ex',
'sudo': True,
'output': None,
'order': 50,
'parser': None,
},
'ovs_ofctl_dump_flows_br_int':
{
'cmd': ['ovs-ofctl', 'dump-flows', 'br-int'],
'help': 'Collect openflow flow table information for ovs bridge br-int',
'sudo': True,
'output': None,
'order': 51,
'parser': None,
},
'ovs_ofctl_dump_flows_br_tun':
{
'cmd': ['ovs-ofctl', 'dump-flows', 'br-tun'],
'help': 'Collect openflow flow table information for ovs bridge br-tun',
'sudo': True,
'output': None,
'order': 52,
'parser': None,
},
'instance_floating_ip_list':
{
'cmd': ['nova', 'floating-ip-list'],
'help': 'Collect floating ip information for instances',
'env': True,
'output': None,
'order': 53,
'parser': floating_ip_list_parser,
},
}
def check_args():
parser = argparse.ArgumentParser(description='Runs commands, collects, and parses output',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('--debug', dest='debug', help='Enable debugging',
default=True, action='store_true')
parser.add_argument('--info_file', dest='info_file',
help='Info will be stored in JSON format in this file',
default="don.json", type=str)
args = parser.parse_args()
settings['debug'] = args.debug
settings['info_file'] = args.info_file
def all_commands_executed(commands):
for cmd in commands.keys():
if commands[cmd]['parser']:
done = commands[cmd].get('done', False)
if done is False:
return False
return True
def get_vm_info_from_compute(cmd):
output = execute_cmd(['nova', 'hypervisor-list'],
sudo=False, shell=False, env=myenv).split('\n')
compute_list = get_hypervisor(output)
vm_info = []
compute_creds = get_vm_credentials()
for node in compute_list:
creds = compute_creds.get('hypervisor').get(
node, compute_creds.get('hypervisor')['default'])
ssh = connect_to_box(node, creds['username'], creds['password'])
(stdin, out, err) = ssh.exec_command('sudo ' + cmd)
vm_info.extend(out.read().splitlines())
ssh.close()
return vm_info
def exec_on_remote(cmd):
node_details = get_vm_credentials()
creds = node_details.get('network')
# print "sudo "+cmd
ssh = connect_to_box(creds['hostname'], creds[
'username'], creds['password'])
(stdin, out, err) = ssh.exec_command(cmd)
if len(err.read()):
return []
return out.read().splitlines()
def get_hypervisor(parse_this):
hypervisor = []
for line in parse_this:
if re.search('^\+', line) or re.search('^$', line) or re.search('Hypervisor hostname', line):
continue
parts = line.split('|')
parts = [x.strip() for x in parts]
name = parts[2]
hypervisor.append(name)
return hypervisor
def main():
check_args()
iteration = 0
# Parser of any specific command might add more commands to be executed.
# Hence continue in a loop.
while True:
if (all_commands_executed(commands) or iteration >= 10):
break
iteration += 1
status_update('Iteration: ' + str(iteration))
sorted_keys = sorted(commands.items(), key=lambda (k, v): v['order'])
for (cmd, dontcare) in sorted_keys:
# Only collect stuff for which we have written a parser
if commands[cmd]['parser']:
if commands[cmd].get('done', False):
continue
if commands[cmd].has_key('help'):
status_update(commands[cmd]['help'])
shell = commands[cmd].get('shell', False)
env = None
if commands[cmd].get('env', False):
env = myenv
sudo = commands[cmd].get('sudo', False)
if deployment_type == 'multinode':
# handling for network node
if cmd.startswith('netns_'):
commands[cmd]['output'] = exec_on_remote(
commands[cmd]['cmd'])
if cmd == 'cat_instance':
commands[cmd]['output'] = get_vm_info_from_compute(commands[
cmd]['cmd'])
print commands[cmd]['output']
else:
commands[cmd]['output'] = execute_cmd(
commands[cmd]['cmd'], sudo=sudo, shell=shell, env=env).split('\n')
else:
commands[cmd]['output'] = execute_cmd(
commands[cmd]['cmd'], sudo=sudo, shell=shell, env=env).split('\n')
commands[cmd]['parser'](commands[cmd]['output'])
commands[cmd]['done'] = True
debug('============= COMMANDS =============')
# debug(pprint.pformat(commands))
status_update('Writing collected info into ' + settings['info_file'])
dump_json(info, settings['info_file'])
if __name__ == "__main__":
main()

View File

@ -0,0 +1,295 @@
# common.py: Common functions and data structures used by multiple modules.
import paramiko
import sys
import re
import pprint
import subprocess
import yaml
# Program settings
settings = {
'debug': False,
}
# Helper functions.
def debug(msg):
if settings['debug']:
if not sys.stdout == sys.__stdout__:
tmp = sys.stdout
sys.stdout = sys.__stdout__
print('DEBUG: ' + msg)
sys.stdout = tmp
else:
print('DEBUG: ' + msg)
def error(msg):
if not sys.stdout == sys.__stdout__:
tmp = sys.stdout
sys.stdout = sys.__stdout__
print('ERROR: ' + msg)
sys.stdout = tmp
else:
print('ERROR: ' + msg)
def warning(msg):
if not sys.stdout == sys.__stdout__:
tmp = sys.stdout
sys.stdout = sys.__stdout__
print('WARNING: ' + msg)
sys.stdout = tmp
else:
print('WARNING: ' + msg)
def status_update(msg):
# storing in log file for interactive display on UI
log = open('collector_log.txt', 'w')
if not sys.stdout == sys.__stdout__:
tmp = sys.stdout
sys.stdout = sys.__stdout__
print('STATUS: ' + msg)
log.write('msg')
sys.stdout = tmp
else:
print('STATUS: ' + msg)
log.write(msg)
def dump_json(json_info, json_filename):
import json
try:
outfile = open(json_filename, "w")
except IOError, e:
print e
print 'Couldn\'t open <%s>; Redirecting output to stdout' % json_filename
outfile = sys.stdout
json.dump(json_info, outfile)
outfile.flush()
outfile.close()
def load_json(json_filename):
import json
try:
infile = open(json_filename, "r")
except IOError, e:
print e
print 'Couldn\'t open <%s>; Error!' % json_filename
return None
tmp = json.load(infile)
infile.close()
return tmp
def connect_to_box(server, username, password, timeout=3):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh.connect(server, username=username,
password=password, timeout=timeout)
except:
return None
return ssh
# def connect_to_box (server, username, password,timeout=3) :
# pass
# this function i will modify to get data from a file instead of giving
# command directly
def ssh_cmd(ssh, cmd):
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(cmd)
error = ssh_stderr.read()
if len(error):
print 'ERROR: ' + error
output = ssh_stdout.read()
ssh_stdout.flush()
return output
# TODO (right now assumes subnet mask to be 24 bits long)
def get_subnet(ip):
subnet = '.'.join(ip.split('.')[:3])
return subnet
def get_router(namespace, info):
routers = info.get('routers', None)
if not routers:
return 'Unknown'
for router in routers.keys():
if routers[router]['id'] in namespace:
return router
return 'Unknown'
# TODO (guaranteed way of figuring out whether network is private or public)
def is_network_public(ip, vm, info):
vm_entry = info['vms'].get(vm)
entry = vm_entry['interfaces'].get(ip, None)
if not entry:
error('Interface: ' + ip + ' does not exist!')
return False
if re.search('public', entry['network']):
return True
return False
def get_intf_ip(info, interface):
intf = strip_interface(interface)
return info['tap_to_ip'].get(intf, 'x.x.x.x')
def ip_to_intf(info, ip):
for intf, intf_ip in info['tap_to_ip'].iteritems():
if intf_ip == ip:
return intf
return None
def router_to_namespace(info, router):
router_entry = info['routers'].get(router, None)
if not router_entry:
return None
net_id = router_entry.get('id', None)
if not net_id:
return None
return 'qrouter-' + net_id
def intf_to_namespace(info, intf):
nms_dict = info['namespaces']
for nms in nms_dict.keys():
if nms_dict[nms].has_key('interfaces'):
if nms_dict[nms]['interfaces'].has_key(intf):
return nms
return None
def get_ip_network(info, vm, ip):
intf_entry = info['vms'][vm]['interfaces'].get(ip, None)
if not intf_entry:
return 'unknown'
return intf_entry.get('network', 'unknown')
def get_vlan_tag(info, interface):
intf = strip_interface(interface)
intf = 'qvo' + intf
br_int = info['bridges']['br-int']
debug('Getting vlan tag for ' + intf)
if br_int['ports'].has_key(intf):
return br_int['ports'][intf].get('tag', '0')
return '0'
def strip_interface(intf):
x = intf
x = x.replace('tap', '')
x = x.replace('qbr', '')
x = x.replace('qvb', '')
x = x.replace('qvo', '')
return x
def get_port_ovs_id_tag(info, vm, port_ip):
for key, ip in info['tap_to_ip'].iteritems():
if ip == port_ip:
qvo = 'qvo' + key
qvo_entry = info['bridges']['br-int']['ports'].get(qvo, None)
if not qvo_entry:
return None
ovs_id = qvo_entry.get('id', None)
ovs_tag = qvo_entry.get('tag', None)
return (ovs_id, ovs_tag)
return None
def execute_cmd(cmd, sudo=False, shell=False, env=None):
if sudo:
if shell is False:
mycmd = ['sudo'] + cmd
else:
mycmd = 'sudo ' + cmd
else:
mycmd = cmd
pprint.pprint(mycmd)
return subprocess.check_output(mycmd,
shell=shell,
stderr=subprocess.STDOUT,
env=env,
universal_newlines=True).replace('\t', ' ')
def get_instance_ips(objs):
ip_list = []
for line in objs:
if re.search('^\+', line) or re.search('^$', line) or re.search('Networks', line):
continue
parts = line.split('|')
parts = [x.strip() for x in parts]
# vm = parts[2]
networks = parts[6].split(';')
networks = [x.strip() for x in networks]
for entry in networks:
# excluding ipv6 ip
if len(entry.split(',')) > 1:
# network = entry.split('=')[0]
ip = filter(lambda a: re.search("(\d+\.\d+\.\d+\.\d+)", a) is not None,
entry.split('=')[1].split(','))[0].strip()
ip_list.append(ip)
else:
ip_list.append(entry.split(',')[0].split('=')[1])
return ip_list
def get_router_names(objs):
routers = []
for line in objs:
if re.search('^\+', line) or re.search('^$', line) or re.search('external_gateway_info', line):
continue
parts = line.split('|')
parts = [x.strip() for x in parts]
name = parts[2]
routers.append(name)
return routers
def get_env(file_path):
try:
lines = open(file_path, 'r').read().splitlines()
except IOError, e:
print "%s :%s" % (e.args[1], file_path)
raise
env = {}
for line in lines:
if line.startswith('export'):
m = re.search(r'export (.+)=(.+)', line)
if m:
key = m.group(1).replace('"', '')
val = m.group(2).replace('"', '')
env.update({key: val})
return env
def get_vm_credentials(config_file='credentials.yaml'):
try:
with open(config_file, 'r') as s:
return yaml.safe_load(s)
except IOError, e:
print '%s :%s' % (e.args[1], config_file)
raise

View File

@ -0,0 +1,24 @@
# provide VM credentials Ex: vm1,vm2 .. if no vms specified default values will be taken
default:
username: cirros
password: cubswin:)
vm1:
username: cirros
password: cubswin:)
vm2:
username: cirros
password: cubswin:)
hypervisor:
default:
username: ubuntu
password: cisco123
compute1:
username:
password:
network:
hostname: 127.0.0.1
username: ubuntu
password: cisco123

View File

@ -0,0 +1 @@
{"bridges": {"br-tun": {"fail_mode": "secure", "ports": {"br-tun": {"mac": "6e:7a:19:13:c9:4e", "interfaces": {"br-tun": {"type": "internal"}}, "id": "LOCAL"}, "patch-int": {"mac": "42:49:d2:83:bc:8b", "interfaces": {"patch-int": {"type": "patch", "options": "peer=patch-tun"}}, "id": "1"}}}, "br-int": {"fail_mode": "secure", "ports": {"qr-8c1c0cb3-5e": {"mac": "00:00:00:00:00:00", "interfaces": {"qr-8c1c0cb3-5e": {"type": "internal"}}, "tag": "1", "id": "4"}, "qr-43b83157-3b": {"mac": "00:00:00:00:00:00", "interfaces": {"qr-43b83157-3b": {"type": "internal"}}, "tag": "2", "id": "8"}, "qr-a9ed186b-b6": {"mac": "00:00:00:00:00:00", "interfaces": {"qr-a9ed186b-b6": {"type": "internal"}}, "tag": "1", "id": "3"}, "qvo71ac5bef-7c": {"mac": "22:ef:c1:2f:74:b4", "interfaces": {"qvo71ac5bef-7c": {}}, "tag": "2", "id": "7"}, "qvo8aa60600-7b": {"mac": "6e:4a:ba:9e:41:fc", "interfaces": {"qvo8aa60600-7b": {}}, "tag": "2", "id": "6"}, "tap88750e1e-d1": {"mac": "00:00:00:00:00:00", "interfaces": {"tap88750e1e-d1": {"type": "internal"}}, "tag": "1", "id": "9"}, "tap59f90a3b-f5": {"mac": "42:e1:86:34:b2:89", "interfaces": {"tap59f90a3b-f5": {"type": "internal"}}, "id": "5"}, "patch-tun": {"mac": "46:85:0f:44:94:dd", "interfaces": {"patch-tun": {"type": "patch", "options": "peer=patch-int"}}, "id": "1"}, "br-int": {"mac": "f6:7f:12:2e:66:49", "interfaces": {"br-int": {"type": "internal"}}, "id": "LOCAL"}, "tap053da1b7-53": {"mac": "2e:e3:08:d3:e4:fa", "interfaces": {"tap053da1b7-53": {"type": "internal"}}, "id": "2"}, "tap1e1c73c9-35": {"mac": "00:00:00:00:00:00", "interfaces": {"tap1e1c73c9-35": {"type": "internal"}}, "tag": "2", "id": "10"}}}, "br-ex": {"ports": {"qg-757bf552-73": {"mac": "00:00:00:00:00:00", "interfaces": {"qg-757bf552-73": {"type": "internal"}}, "id": "2"}, "qg-26e738c4-f8": {"mac": "00:00:00:00:00:00", "interfaces": {"qg-26e738c4-f8": {"type": "internal"}}, "id": "1"}, "br-ex": {"mac": "62:ed:7e:21:23:08", "interfaces": {"br-ex": {"type": "internal"}}, "id": "LOCAL"}}}}, "routers": {"router1": {"network_id": "3f6dda86-0ae2-475d-a71c-a0d8d7233a0a", "ip_address": "172.24.4.3", "id": "90111551-6cfc-4be0-b1c2-ce8bffb7edf6"}}, "vms": {"vm2": {"tap_dev": ["tap71ac5bef-7c"], "interfaces": {"10.10.0.4": {"network": "private1"}}, "src_bridge": ["qbr71ac5bef-7c"], "uuid": "ddb4de16-4729-4732-a73b-557d75f28180"}, "vm1": {"tap_dev": ["tap8aa60600-7b"], "interfaces": {"10.10.0.3": {"network": "private1"}}, "src_bridge": ["qbr8aa60600-7b"], "uuid": "72973345-78b0-4886-8fe9-9e29aa9fba9f"}}, "brctl": {"qbr71ac5bef-7c": {"interfaces": ["qvb71ac5bef-7c", "tap71ac5bef-7c"]}, "qbr8aa60600-7b": {"interfaces": ["qvb8aa60600-7b"]}}, "namespaces": {"qrouter-5a5b1d7f-263e-4d7f-a508-60d359d68a01": {}, "qdhcp-25fe7626-552c-4040-b2b6-8050ff7590e0": {"interfaces": {"tap88750e1e-d1": "10.0.0.3/24"}}, "qrouter-90111551-6cfc-4be0-b1c2-ce8bffb7edf6": {"interfaces": {"qg-757bf552-73": "172.24.4.3/24", "qr-43b83157-3b": "10.10.0.1/24"}}, "qdhcp-f89297fc-3edf-47cf-9d3a-15d40639cb77": {"interfaces": {"tap1e1c73c9-35": "10.10.0.5/24"}}}, "networks": {"f89297fc-3edf-47cf-9d3a-15d40639cb77": {"ip": "10.10.0.0/24", "name": "private1"}, "3f6dda86-0ae2-475d-a71c-a0d8d7233a0a": {"ip": "172.24.4.0/24", "name": "public"}, "25fe7626-552c-4040-b2b6-8050ff7590e0": {"ip": "10.0.0.0/24", "name": "private"}}, "tap_to_ip": {"": "fdb4:816a:6faf:0:f816:3eff:feb1:fb45", "a9ed186b-b6": "10.0.0.1", "1e1c73c9-35": "10.10.0.5", "71ac5bef-7c": "10.10.0.4", "8aa60600-7b": "10.10.0.3", "26e738c4-f8": "172.24.4.2", "88750e1e-d1": "10.0.0.3", "43b83157-3b": "10.10.0.1", "8c1c0cb3-5e": "fdb4:816a:6faf::1", "757bf552-73": "172.24.4.3"}}

View File

@ -0,0 +1,10 @@
from django import forms
class PingForm(forms.Form):
src_ip = forms.CharField(label='Source IP', widget=forms.Select(
attrs={'class': 'form-control switchable'}, choices=[('', "")]))
dst_ip = forms.CharField(label='Destination IP', widget=forms.Select(
attrs={'class': 'form-control switchable'}, choices=[('', "")]))
router = forms.CharField(label='Router', widget=forms.Select(
attrs={'class': 'form-control switchable'}, choices=[('', "")]))

View File

@ -0,0 +1,11 @@
import pprint
import sys
from common import load_json
if len(sys.argv) != 2:
print ('Usage: ' + sys.argv[0] + ' <json file to display>')
exit(1)
info = load_json(sys.argv[1])
pprint.pprint(info)

View File

@ -0,0 +1,176 @@
#
# ovs.py: Runs ovs-appctl command to check if A -> B flow is working fine.
#
#
import re
import argparse
import json
from common import debug, settings
from common import execute_cmd
params = {}
output_dict = {
'comment': None,
'pass': None,
'command_list': [],
'errors': [],
'debugs': [],
}
# Learn a MAC on the dst port and then check if sending from the src port to
# the learned MAC gives correct lookup
def ovs_test(src_port_id, dst_port_id, tag, ovs_bridge):
smac = 'AA:BB:CC:DD:EE:11'
dmac = 'AA:BB:CC:DD:EE:22'
cmd_dict = {}
# Step 0. Flush the fdb
cmd = ''
cmd += 'sudo ovs-appctl fdb/flush br-int'
output = execute_cmd(cmd, shell=True).split('\n')
cmd_dict['cmd'] = cmd
cmd_dict['output'] = output
output_dict['command_list'].append(cmd_dict)
cmd_dict = {}
# Step 1. run command that will learn smac
cmd = ''
cmd += 'sudo ovs-appctl ofproto/trace %s in_port=%s' % (
ovs_bridge, src_port_id)
cmd += ',dl_src=' + smac + ',dl_dst=' + dmac + ' -generate'
output = execute_cmd(cmd, shell=True).split('\n')
cmd_dict['cmd'] = cmd
cmd_dict['output'] = output
output_dict['command_list'].append(cmd_dict)
cmd_dict = {}
# Step 2. verify that the mac has been learnt
cmd = ''
cmd += 'sudo ovs-appctl fdb/show br-int'
output = execute_cmd(cmd, shell=True).split('\n')
cmd_dict['cmd'] = cmd
cmd_dict['output'] = output
output_dict['command_list'].append(cmd_dict)
cmd_dict = {}
port = None
for line in output:
m = re.search('(\d)\s+(\d+)\s+(\S+)\s+\d+', line)
if m:
mac = m.group(3)
if mac.lower() == smac.lower():
port = m.group(1)
vlan = m.group(2)
debug(line)
break
if not port:
output_dict['errors'].append(
'%s not learnt on port %s' % (smac, src_port_id))
output_dict['pass'] = False
return False
if vlan != tag:
output_dict['errors'].append(
'%s learnt on vlan %s but should have been learnt on vlan %s on port %s' % (smac, vlan, tag, port))
output_dict['pass'] = False
return False
output_dict['debugs'].append(
'%s learnt on expected vlan %s on port %s' % (smac, vlan, port))
# Step 3. now do a lookup using the dst port id and dmac as the smac of
# step 1.
cmd = ''
cmd += 'sudo ovs-appctl ofproto/trace %s in_port=%s' % (
ovs_bridge, dst_port_id)
cmd += ',dl_src=' + dmac + ',dl_dst=' + smac + ' -generate'
output = execute_cmd(cmd, shell=True).split('\n')
cmd_dict['cmd'] = cmd
cmd_dict['output'] = output
output_dict['command_list'].append(cmd_dict)
cmd_dict = {}
forwarded = False
egress_port = None
for line in output:
if re.search('forwarding to learned port', line):
forwarded = True
continue
m = re.search('Datapath actions: (.*)', line)
if m:
egress_port = m.group(1)
continue
result = True
if not forwarded:
output_dict['errors'].append('Packet for learnt mac not forwarded!')
result = False
else:
output_dict['debugs'].append(
'Packet for learnt mac forwarded properly')
if egress_port:
if egress_port == src_port_id:
output_dict['debugs'].append(
'Packet forwarded to correct port %s' % egress_port)
else:
output_dict['errors'].append('Packet forwarded to incorrect port %s, expected %s' %
(egress_port, src_port_id))
result = False
else:
output_dict['errors'].append('No egress port assigned to packet! Expected %s' %
src_port_id)
result = False
output_dict['pass'] = result
return result
def check_args():
global params
parser = argparse.ArgumentParser(
description='OVS test', formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('--debug', dest='debug',
help='Enable debugging', default=False, action='store_true')
parser.add_argument('--src_port_id', dest='src_port_id',
help='OVS src port id (required)', type=str, required=True)
parser.add_argument('--dst_port_id', dest='dst_port_id',
help='OVS dst port id (required)', type=str, required=True)
parser.add_argument(
'--tag', dest='tag', help='VLAN tag of port (required)', type=str, required=True)
parser.add_argument('--ovs_bridge', dest='ovs_bridge',
help='OVS bridge to be tested (required)', type=str, required=True)
args = parser.parse_args()
settings['debug'] = args.debug
params['src_port_id'] = args.src_port_id
params['dst_port_id'] = args.dst_port_id
params['tag'] = args.tag
params['ovs_bridge'] = args.ovs_bridge
def main():
global output_dict
check_args()
src_port_id = params['src_port_id']
dst_port_id = params['dst_port_id']
tag = params['tag']
ovs_bridge = params['ovs_bridge']
ovs_success = ovs_test(src_port_id, dst_port_id, tag, ovs_bridge)
output_dict[
'comment'] = 'ovs %s port %s --> %s' % (ovs_bridge, src_port_id, dst_port_id)
output_dict['pass'] = ovs_success
a = json.dumps(output_dict, sort_keys=True, indent=4)
print a
pass
if __name__ == "__main__":
main()

View File

@ -0,0 +1,12 @@
from django.utils.translation import ugettext_lazy as _
import horizon
from don import dashboard
class ovs(horizon.Panel):
name = _("OVS")
slug = "ovs"
dashboard.DonDashboard.register(ovs)

View File

@ -0,0 +1,496 @@
#
# path.py: Figures out a path between two IP addresses and then traces it
#
# HOWTO:
#
import re
import pprint
import subprocess
import argparse
import os.path
import signal
import json
import time
from common import error, settings, debug, status_update
from common import load_json, execute_cmd, dump_json
from common import ip_to_intf, intf_to_namespace, router_to_namespace
COUNT = 10 # how many packets to be captured by tcpdump
def get_port_info(info, port_ip):
port_info = None
for tap, ip in info['tap_to_ip'].iteritems():
if ip == port_ip:
port_info = {}
port_info['ip'] = ip
port_info['ports'] = {}
port_info['ports']['tap'] = 'tap' + tap
port_info['ports']['brctl'] = 'qbr' + tap
port_info['ports']['qvb'] = 'qvb' + tap
port_info['ports']['qvo'] = 'qvo' + tap
# also get the tag (used later to figure out where to run tcpdump)
br_int = info['bridges'].get('br-int', None)
if not br_int:
error('No OVS integration bridge (br-int)! Cannot proceed')
return None
tag = br_int['ports'][port_info['ports']['qvo']]['tag']
port_info['tag'] = tag
break
return port_info
def qrouter_usable(qrouter, src_ip, dst_ip, username, passwd):
status_update('Testing whether %s is reachable via qrouter %s (dst %s)' % (
src_ip, qrouter, dst_ip))
outfile = 'path.testping.txt'
ping_process = launch_ping(
src_ip, dst_ip, username, passwd, 2, 2, qrouter, outfile)
status_update("Ping process %s" % (ping_process))
time.sleep(5)
ping_pass = process_ping(outfile, src_ip, check_ssh_connectivity_only=True)
if ping_pass:
status_update('IP %s is reachable via qrouter: %s' % (src_ip, qrouter))
return True
else:
error('IP %s is reachable via qrouter: %s' % (src_ip, qrouter))
return False
def launch_ping(src_ip, dst_ip, username, passwd, count, timeout, qrouter, filename):
cmd = 'sudo ip netns exec ' + str(qrouter)
cmd += ' python ping.py --src_ip %s --dst_ip %s --username "%s" --passwd "%s" --count %d --timeout %d' % \
(src_ip, dst_ip, username, passwd, count, timeout)
cmd += ' > %s 2>&1' % filename
p = subprocess.Popen(cmd, shell=True)
return p
def capture_network_packets(params, hop_list):
global net_info
net_info = {
'pids': [],
'hops': hop_list,
}
for hop in net_info['hops']:
dev = hop['dev']
nms = hop['nms']
filename = 'net.tcpdump.%s.txt' % (dev)
if os.path.isfile(filename):
os.remove(filename)
cmd = 'sudo ip netns exec %s ' % nms
cmd += 'tcpdump -v icmp -i %s -c %d -l > %s 2>&1' % (
dev, params['count'], filename)
pid = subprocess.Popen(cmd, shell=True).pid
net_info['pids'].append(pid)
status_update(
'net: tcpdump launched with pid %d for interface %s' % (pid, dev))
pass
def capture_packets(params, tag='src', src_tag=None):
if tag == 'src':
port_info = src_info
elif tag == 'dst':
port_info = dst_info
else:
error('tag has to be one of [src, dst]!')
return
# XXX TODO
# If src_tag and dst_tag are the same, then we need to monitor on just
# br-int. Else, we will need to monitor on qr- ports (router ports)
port_info['pids'] = []
for port in port_info['ports'].keys():
intf = port_info['ports'][port]
filename = '%s.tcpdump.%s.txt' % (tag, intf)
if os.path.isfile(filename):
os.remove(filename)
cmd = 'sudo tcpdump -v icmp -i %s -c %d -l > %s 2>&1' % (
intf, params['count'], filename)
pid = subprocess.Popen(cmd, shell=True).pid
port_info['pids'].append(pid)
status_update(
'%s: tcpdump launched with pid %d for interface %s' % (tag, pid, intf))
def process_ping(filename, ip=None, check_ssh_connectivity_only=False):
if not os.path.isfile(filename):
return False
status_update('Trying to read ' + filename)
with open(filename) as f:
lines = f.readlines()
pprint.pprint(lines)
info = load_json(filename)
if not check_ssh_connectivity_only:
return info.get('pass', False)
cmd_list = info['command_list']
for cmd in cmd_list:
m = re.search(
'ssh (\S+) with provided username and passwd', cmd['cmd'])
if m:
if ip == m.group(1):
return cmd['pass']
return False
def process_network_captures():
global net_info
net_info['counts'] = {}
net_info['pass'] = []
net_info['fail'] = []
for hop in net_info['hops']:
dev = hop['dev']
# Assume tcpdump did not capture anything
net_info['counts'][dev] = 0
net_info['fail'].append(dev)
filename = 'net.tcpdump.%s.txt' % (dev)
if not os.path.isfile(filename):
continue
with open(filename) as f:
lines = f.readlines()
for line in lines:
m = re.search('(\d+)\s+packets captured', line)
if m:
net_info['counts'][dev] = int(m.group(1))
net_info['pass'].append(dev)
break
'''
cmd = 'grep captured ' + filename
output = execute_cmd(cmd, shell=True).split('\n')[0]
m = re.search('(\d+)\s+packets captured', output)
if m:
net_info['counts'][dev] = int(m.group(1))
net_info['pass'].append(dev)
else:
net_info['counts'][dev] = 0
net_info['fail'].append(dev)
'''
def process_captures(tag='src'):
if tag == 'src':
port_info = src_info
elif tag == 'dst':
port_info = dst_info
else:
error('tag has to be one of [src, dst]!')
return
port_info['counts'] = {}
port_info['pass'] = []
port_info['fail'] = []
for key in port_info['ports'].keys():
intf = port_info['ports'][key]
# Assume tcpdump did not capture anything
port_info['counts'][key] = 0
port_info['fail'].append(intf)
filename = '%s.tcpdump.%s.txt' % (tag, intf)
if not os.path.isfile(filename):
continue
with open(filename) as f:
lines = f.readlines()
for line in lines:
m = re.search('(\d+)\s+packets captured', line)
if m:
port_info['counts'][key] = int(m.group(1))
port_info['pass'].append(intf)
break
'''
cmd = 'grep captured ' + filename
output = execute_cmd(cmd, shell=True).split('\n')[0]
m = re.search('(\d+)\s+packets captured', output)
if m:
port_info['counts'][key] = int(m.group(1))
port_info['pass'].append(intf)
else:
port_info['counts'][key] = 0
port_info['fail'].append(intf)
'''
def cleanup_processes(pid_list):
pprint.pprint(pid_list)
for pid in pid_list:
try:
os.kill(pid, signal.SIGKILL)
status_update('Successfully killed pid: %d' % pid)
except OSError:
status_update('Process with pid: %d no longer exists' % pid)
continue
pass
def check_args(params):
parser = argparse.ArgumentParser(description='Does ping test and captures packets along the expected path',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('--debug', dest='debug',
help='Enable debugging', default=True,
action='store_true')
parser.add_argument('--src_ip', dest='src_ip',
help='IP from where ping will be run (required)',
type=str, required=True)
parser.add_argument('--dst_ip', dest='dst_ip',
help='IP to which ping will be run (required)',
type=str, required=True)
parser.add_argument('--username', dest='username',
help='SSH login username (required)',
type=str, required=True)
parser.add_argument('--passwd', dest='passwd',
help='SSH login passwd (required)',
type=str, required=True)
parser.add_argument('--json_file', dest='json_file',
help='JSON file having info of installation (required)',
type=str, required=True)
parser.add_argument('--count', dest='count',
help='ping count', type=int, default=COUNT)
parser.add_argument('--timeout', dest='timeout',
help='ping timeout (-W option of ping) in seconds',
type=int, default=2)
parser.add_argument('--router', dest='router',
help='router to be used for the test', type=str,
required=True)
parser.add_argument('--path_file', dest='path_file',
help="Test results are printed in this file in JSON format",
type=str, default='path.json')
args = parser.parse_args()
params['debug'] = args.debug
params['src_ip'] = args.src_ip
params['dst_ip'] = args.dst_ip
params['username'] = args.username
params['passwd'] = args.passwd
params['count'] = args.count
params['timeout'] = args.timeout
params['json_file'] = args.json_file
params['router'] = args.router
params['path_file'] = args.path_file
def path_same_network(params, nms_hops=None):
src_ip = params['src_ip']
dst_ip = params['dst_ip']
json_file = params['json_file']
username = params['username']
passwd = params['passwd']
count = params['count']
timeout = params['timeout']
qrouter = params['qrouter']
router = params['router']
if qrouter_usable(qrouter, src_ip, dst_ip, username, passwd):
outfile = 'path.ping.txt'
ping_process = launch_ping(src_ip, dst_ip, username, passwd, count,
timeout, qrouter, outfile)
debug('Ping started with pid: %d' % ping_process.pid)
capture_packets(params, 'src')
capture_packets(params, 'dst', src_tag=src_info['tag'])
if src_info['tag'] != dst_info['tag']:
capture_network_packets(params, nms_hops)
status_update('Waiting %s sec for tcpdump and ping processes to complete' % (
params['count'] + 2))
time.sleep(params['count'] + 4)
status_update('if processes have not stopped, lets kill them')
cleanup_processes([ping_process.pid] +
src_info['pids'] + dst_info['pids'])
if net_info:
cleanup_processes(net_info['pids'])
process_captures('src')
process_captures('dst')
if src_info['tag'] != dst_info['tag']:
process_network_captures()
ping_pass = process_ping(outfile)
debug(pprint.pformat(src_info))
debug(pprint.pformat(dst_info))
debug(pprint.pformat(net_info))
info = {
'src': src_ip,
'dst': dst_ip,
'src_info': src_info,
'dst_info': dst_info,
'net_info': net_info,
'ping_pass': ping_pass,
'error': '',
}
status_update('Dumping results into %s in JSON format' %
params['path_file'])
dump_json(info, params['path_file'])
if params['plot']:
cmd = 'python plot.py --info_file %s --highlight_file %s --combined_file static/ping' % (
json_file, params['path_file'])
status_update('Running ' + cmd)
output = execute_cmd(cmd, shell=True).split('\n')
debug(pprint.pformat(output))
status_update('Done')
else:
err_msg = 'Cannot reach %s via router %s' % (src_ip, router)
info = {
'src': src_ip,
'dst': dst_ip,
'src_info': src_info,
'dst_info': dst_info,
'ping_pass': False,
'error': err_msg
}
error(err_msg)
status_update('Dumping results into %s in JSON format' %
params['path_file'])
dump_json(info, params['path_file'])
status_update('Done')
def run_remote_cmd(cmd):
debug('Running: ' + cmd)
return subprocess.check_output(cmd,
shell=True,
stderr=subprocess.STDOUT,
universal_newlines=True).replace('\t', ' ')
def get_next_hop(src_info, dst_info, qrouter, params):
next_hop_list = []
next_hop = None
username = params['username']
passwd = params['passwd']
src_ip = src_info['ip']
dst_ip = dst_info['ip']
remote_cmd = ' ip route get %s' % dst_ip
cmd = 'sudo ip netns exec ' + qrouter
cmd += ' python run_nms_cmd.py --host_ip %s --username "%s" --passwd "%s" --cmd "%s" ' % \
(src_ip, username, passwd, remote_cmd)
output = run_remote_cmd(cmd)
a = json.loads(output)
if not a['pass']:
return []
json_file = params['json_file']
info = load_json(json_file)
next_hop = {}
for cmd in a['command_list']:
if re.search('ip route get', cmd['cmd']):
m = re.search('\S+\s+via\s+(\S+)', cmd['output'][0])
if m:
next_hop['ip'] = m.group(1)
next_hop['dev'] = 'qr-' + ip_to_intf(info, next_hop['ip'])
next_hop['nms'] = intf_to_namespace(info, next_hop['dev'])
break
next_hop_list.append(next_hop)
cmd = 'sudo ip netns exec ' + next_hop['nms']
cmd += remote_cmd
output = run_remote_cmd(cmd).split('\n')
prev_nms = next_hop['nms']
next_hop = {}
m = re.search('\S+\s+dev\s+(\S+)', output[0])
if m:
next_hop['dev'] = m.group(1)
next_hop['nms'] = prev_nms
next_hop_list.append(next_hop)
return next_hop_list
def path(params):
global src_info
global dst_info
global net_info
src_info = None
dst_info = None
net_info = None
settings['debug'] = True
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
CUR_DIR = os.getcwd()
if not re.search('/openstack_dashboard/don/', CUR_DIR):
os.chdir(BASE_DIR + '/ovs')
NEW_DIR = os.getcwd()
debug(BASE_DIR + ':' + CUR_DIR + ':' + NEW_DIR)
src_ip = params['src_ip']
dst_ip = params['dst_ip']
json_file = params['json_file']
router = params['router']
debug('Json_file: ' + json_file)
info = load_json(json_file)
qrouter = router_to_namespace(info, router)
params['qrouter'] = qrouter
src_info = get_port_info(info, src_ip)
dst_info = get_port_info(info, dst_ip)
if src_info is None:
return "Source ip not found on the network"
if dst_info is None:
return "Destination ip not found on the network"
if qrouter is None:
return "No such router information found on the network"
# src and dst are in the same network
if src_info['tag'] == dst_info['tag']:
path_same_network(params)
else:
status_update('The source and destination are in different networks')
next_hop_list = get_next_hop(src_info, dst_info, qrouter, params)
if len(next_hop_list) == 0:
error('Could not find next hop list from %s to %s' %
(src_ip, dst_ip))
path_same_network(params, next_hop_list)
pass
def main():
params = {}
check_args(params)
settings['debug'] = params['debug']
path(params)
if __name__ == "__main__":
main()

View File

@ -0,0 +1,122 @@
#
# ping.py: Runs a ping test from src_ip to dst_ip. Also provides analysis if
# things are not okay (TBD).
#
# HOWTO:
#
# For OpenStack, this program must be run from inside the correct namespace
#
# sudo ip netns exec qrouter-ac41aab2-f9c3-4a06-8eef-f909ee1e6e50 python ping.py 10.0.3.3 10.0.2.4 cirros "cubswin:)"
#
import re
import argparse
import json
from common import connect_to_box, ssh_cmd
from common import settings
params = {}
output_dict = {
'comment': None,
'pass': None,
'command_list': [],
'errors': [],
}
def ping_test(src_ip, dst_ip, username, passwd, count, timeout):
global output_dict
result = False
cmd_dict = {}
try:
ssh = connect_to_box(src_ip, username, passwd)
cmd_dict['cmd'] = 'ssh %s with provided username and passwd' % src_ip
if not ssh:
cmd_dict['output'] = 'Could not ssh to ' + src_ip
cmd_dict['pass'] = False
output_dict['command_list'].append(cmd_dict)
return False
else:
cmd_dict['pass'] = True
output_dict['command_list'].append(cmd_dict)
cmd_dict = {}
cmd = 'ping -c %s -W %s %s' % (count, timeout, dst_ip)
output = ssh_cmd(ssh, cmd).split('\n')
cmd_dict['cmd'] = cmd
cmd_dict['output'] = output
for line in output:
m = re.search('(\d+) packets transmitted, (\d+) packets received', line) or \
re.search('(\d+) packets transmitted, (\d+) received',
line) # also handles cirros vm ping response
if m:
tx_pkts = float(m.group(1))
rx_pkts = float(m.group(2))
if rx_pkts / tx_pkts >= 0.75:
result = True
break
except (KeyboardInterrupt, SystemExit):
print '\nkeyboardinterrupt caught (again)'
print '\n...Program Stopped Manually!'
raise
cmd_dict['pass'] = result
output_dict['command_list'].append(cmd_dict)
return result
def check_args():
global params
parser = argparse.ArgumentParser(
description='Ping test',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('--debug', dest='debug',
help='Enable debugging',
default=False, action='store_true')
parser.add_argument('--src_ip', dest='src_ip',
help='IP from where ping will be run (required)',
type=str, required=True)
parser.add_argument('--dst_ip', dest='dst_ip',
help='IP to which ping will be run (required)',
type=str, required=True)
parser.add_argument('--username', dest='username',
help='SSH login username (required)', type=str,
required=True)
parser.add_argument('--passwd', dest='passwd',
help='SSH login passwd (required)',
type=str, required=True)
parser.add_argument('--count', dest='count',
help='ping count', type=str, default='2')
parser.add_argument('--timeout', dest='timeout',
help='ping timeout (-W option of ping) in seconds',
type=str, default='4')
args = parser.parse_args()
settings['debug'] = args.debug
params['src_ip'] = args.src_ip
params['dst_ip'] = args.dst_ip
params['username'] = args.username
params['passwd'] = args.passwd
params['count'] = args.count
params['timeout'] = args.timeout
def main():
global output_dict
check_args()
src_ip = params['src_ip']
dst_ip = params['dst_ip']
ping_success = ping_test(src_ip, dst_ip,
params['username'], params['passwd'],
params['count'], params['timeout'])
output_dict['comment'] = 'PING %s to %s' % (src_ip, dst_ip)
output_dict['pass'] = ping_success
a = json.dumps(output_dict, sort_keys=True, indent=4)
print a
if __name__ == "__main__":
main()

View File

@ -0,0 +1,898 @@
#
# plot.py: Generates an SVG file showing the networking internals of a compute node.
#
import pprint
import subprocess
import re
import argparse
import sys
import random
from common import settings, debug, warning
from common import load_json, get_subnet
from common import get_vlan_tag, get_intf_ip, get_ip_network
class DotGenerator:
def __init__(self, in_json_filename,
compute_dot_file, compute_svg_file,
network_dot_file, network_svg_file,
combined_dot_file, combined_svg_file,
highlight_file):
self.json_filename = in_json_filename
self.compute_dot_file = compute_dot_file
self.compute_svg_file = compute_svg_file
self.network_dot_file = network_dot_file
self.network_svg_file = network_svg_file
self.combined_dot_file = combined_dot_file
self.combined_svg_file = combined_svg_file
self.highlight_file = highlight_file
settings['debug'] = True
self.highlight_info = None
if highlight_file:
self.highlight_info = load_json(self.highlight_file)
if not self.highlight_info.get('net_info'):
self.highlight_info['net_info'] = {'pass': [],
'fail': []
}
self.info = load_json(self.json_filename)
self.outfile = None
self.colors = {
'vms': '#ff9933',
'tap': '#99ffff',
'qbr': '#9966ff',
'br-int': '#ff6666',
'br-tun': '#ff6666',
'qvb': '#ffcc00',
'qvo': '#ffcc00',
'tun': '#ffcc00',
'int': '#ffcc00',
'routers': '#ff9933',
'vlan': [],
'error': '#f00000',
'edge': '#0066cc',
'dontcare': '#909090',
'pass': '#b2f379',
'fail': '#f00000',
'edge_pass': '#009900',
'floating_ip': '#b3ffb3',
}
self.__set_vlan_color_table()
pprint.pprint(self.info)
def __port_pass(self, port):
if self.highlight_file:
if port.replace('.', '') == self.highlight_info['src_info']['ip'].replace('.', '') or \
port.replace('.', '') == self.highlight_info['dst_info']['ip'].replace('.', ''):
return self.highlight_info['ping_pass']
if self.highlight_info['src_info'].has_key('pass') and port in self.highlight_info['src_info']['pass'] or \
self.highlight_info['dst_info'].has_key('pass') and port in self.highlight_info['dst_info']['pass'] or \
self.highlight_info['net_info'].has_key('pass') and port in self.highlight_info['net_info']['pass']:
return True
return False
def __port_fail(self, port):
if self.highlight_file:
if port.replace('.', '') == self.highlight_info['src_info']['ip'].replace('.', '') or \
port.replace('.', '') == self.highlight_info['dst_info']['ip'].replace('.', ''):
return not self.highlight_info['ping_pass']
if self.highlight_info['src_info'].has_key('fail') and port in self.highlight_info['src_info']['fail'] or \
self.highlight_info['dst_info'].has_key('fail') and port in self.highlight_info['dst_info']['fail'] or \
self.highlight_info['net_info'].has_key('fail') and port in self.highlight_info['net_info']['fail']:
return True
return False
def __get_edge_color(self, src_tag, dst_tag):
if not self.highlight_file:
return self.__get_color('edge')
sport = src_tag
dport = dst_tag
m = re.search('\S+:(\S+)', src_tag)
if m:
sport = m.group(1)
m = re.search('\S+:(\S+)', dst_tag)
if m:
dport = m.group(1)
spass = self.__port_pass(sport)
dpass = self.__port_pass(dport)
sfail = self.__port_fail(sport)
dfail = self.__port_fail(dport)
debug('%s (p%d f%d) -> %s (p%d f%d)' % (sport, spass, sfail, dport,
dpass, dfail))
if spass or dpass:
return self.colors['edge_pass']
if sfail and dfail:
return self.colors['fail']
return self.colors['dontcare']
def __get_color(self, tag):
if self.highlight_file:
return self.colors['dontcare']
else:
return self.colors[tag]
def __hsv_to_rgb(self, h, s, v):
h_i = int((h * 6))
f = h * 6 - h_i
p = v * (1 - s)
q = v * (1 - f * s)
t = v * (1 - (1 - f) * s)
if h_i == 0:
r, g, b = v, t, p
if h_i == 1:
r, g, b = q, v, p
if h_i == 2:
r, g, b = p, v, t
if h_i == 3:
r, g, b = p, q, v
if h_i == 4:
r, g, b = t, p, v
if h_i == 5:
r, g, b = v, p, q
return [r * 256, g * 256, b * 256]
def __set_vlan_color_table(self):
i = 20
random.seed(1)
while i > 0:
colors = self.__hsv_to_rgb(random.random(), 0.5, 0.95)
colors = [hex(int(x)).split('x')[1] for x in colors]
colors = ''.join(x for x in colors)
self.colors['vlan'].append('#' + colors)
i -= 1
debug(pprint.pformat(self.colors['vlan']))
# port becomes relevant only if highlight_file is specified.
def __get_vlan_color(self, tag, port='dummy'):
if self.highlight_file:
if self.__port_pass(port):
return self.colors['pass']
elif self.__port_fail(port):
return self.colors['fail']
else:
return self.colors['dontcare']
else:
total_colors = len(self.colors['vlan'])
return self.colors['vlan'][int(tag) % total_colors]
def __get_total_vm_port_count(self):
port_count = 0
for vm in self.info['vms'].keys():
port_count += len(self.info['vms'][vm]['src_bridge'])
return port_count
# TODO XXX needs some work to handle different subnet mask length. LPM needs
# to be implemented!
def __get_network_id(self, ip):
networks = self.info['networks']
subnet = get_subnet(ip)
for net in networks.keys():
if re.search(subnet, networks[net]['ip']):
return net
return None
def __get_network_name(self, ip):
network_id = self.__get_network_id(ip)
return self.info['networks'][network_id]['name']
def __get_tap_interface(self, namespace, qr_intf):
namespaces = self.info['namespaces']
ip = namespaces[namespace]['interfaces'][qr_intf]
network_id = self.__get_network_id(ip)
if not network_id:
return 'No TAP! 1'
qdhcp = 'qdhcp-' + network_id
if not namespaces.has_key(qdhcp):
return 'No TAP! 2'
for intf in namespaces[qdhcp]['interfaces'].keys():
return (qdhcp, intf)
pass
def __get_router_port_count(self, router, port_type='qr'):
port_count = 0
router_id = self.info['routers'][router]['id']
qrouter = 'qrouter-' + router_id
namespaces = self.info['namespaces']
for nms in namespaces.keys():
if re.search('^' + qrouter, nms):
for intf in namespaces[nms]['interfaces'].keys():
if re.search('^' + port_type, intf):
port_count += 1
return port_count
def __get_total_port_count(self, port_type='qr'):
port_count = 0
for router in self.info['routers'].keys():
port_count += self.__get_router_port_count(router, port_type)
return port_count
def __get_total_dhcp_port_count(self):
port_count = 0
namespaces = self.info['namespaces']
for nms in namespaces.keys():
if re.search('^qdhcp-', nms):
for intf in namespaces[nms]['interfaces'].keys():
if re.search('^tap', intf):
port_count += 1
return port_count
def __html_row_open(self):
print '<TR>'
def __html_row_close(self):
print '</TR>'
def __html_row(self, name, rspan, cspan, color, tag=None):
# tags do not allow "-" (dash) in DOT language. Convert to "_"
# (underscore)
if tag:
print '<TD ROWSPAN="%d" COLSPAN="%d" BGCOLOR="%s" PORT="%s">%s</TD>' % (rspan, cspan, color, tag.replace('-', '_'), name)
else:
print '<TD ROWSPAN="%d" COLSPAN="%d" BGCOLOR="%s">%s</TD>' % (rspan, cspan, color, name)
pass
def __html_edge(selft, src_tag, dst_tag, color, penwidth="4", style=None):
src_tag = src_tag.replace('-', '_')
dst_tag = dst_tag.replace('-', '_')
if not style:
print '%s:s -> %s:n [color = "%s", penwidth = "%s"]' % (src_tag,
dst_tag,
color,
penwidth)
else:
print '%s:s -> %s:n [color = "%s", penwidth = "%s", style="%s"]' % (src_tag,
dst_tag,
color,
penwidth,
style)
def __digraph_open(self, tag):
msg = 'digraph DON_' + tag + ' {' + \
'''
graph [fontsize=10 fontname="Helvetica"];
node [fontsize=10 fontname="Helvetica"];
rankdir = TB;
ranksep = 1;
concentrate = true;
compound = true;
edge [dir=none]
'''
print msg
def __digraph_close(self):
msg = '\n}\n'
print msg
def __cluster_name(self, tag, col_span, color="white"):
self.__html_row_open()
port = tag.replace(' ', '').replace('-', '_')
print '<TD COLSPAN="%d" BORDER="0" BGCOLOR="%s" PORT="%s">%s</TD>' % (col_span, color, port, tag)
self.__html_row_close()
def __cluster_open_plain(self, tag, label=None):
print 'subgraph cluster_%s {' % (tag)
print 'style=filled'
if label:
print 'label="%s"' % (label)
def __cluster_close_plain(self):
print '}\n'
def __cluster_open(self, tag, color="white"):
print 'subgraph cluster_%s {' % (tag)
print '%s [ shape = plaintext, label = <' % (tag)
print '<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="%s">' % (color)
pass
def __cluster_close(self):
print '</TABLE>>];\n'
print '}\n'
pass
def __plot_title_edges(self, tag):
if tag == 'compute':
src_tag = 'ComputeNode'
dst_tag = 'VMs'
else:
src_tag = 'NetworkNode'
dst_tag = 'br_ex'
self.__html_edge(src_tag, dst_tag,
self.__get_color('edge'), style="invis")
def __plot_vms(self):
col_span = self.__get_total_vm_port_count()
row_span = 1
self.__cluster_open('VMs')
self.__cluster_name('VMs', col_span)
# Plot each VM at a time
self.__html_row_open()
for vm in sorted(self.info['vms'].keys()):
col_span = len(self.info['vms'][vm]['src_bridge'])
if self.info['floating_ips'].get(self.info['vms'][vm]['uuid']):
col_span = col_span + 1
self.__html_row(vm, row_span, col_span, self.__get_color('vms'))
self.__html_row_close()
# Plot the networks for each port
self.__html_row_open()
col_span = 1
for vm in sorted(self.info['vms'].keys()):
floating_ip_info = self.info['floating_ips'].get(
self.info['vms'][vm]['uuid'])
if floating_ip_info:
network = floating_ip_info.get('pool')
self.__html_row('Floating -' + network, row_span,
col_span, self.colors['floating_ip'])
for bridge in sorted(self.info['vms'][vm]['src_bridge']):
tag = get_vlan_tag(self.info, bridge)
ip = get_intf_ip(self.info, bridge)
network = get_ip_network(self.info, vm, ip)
color = self.__get_vlan_color(tag)
if re.search('unknown', network):
color = self.__get_color('error')
self.__html_row(network, row_span, col_span, color)
self.__html_row_close()
# Plot the IPs for each port
self.__html_row_open()
for vm in sorted(self.info['vms'].keys()):
floating_ip_info = self.info['floating_ips'].get(
self.info['vms'][vm]['uuid'])
if floating_ip_info:
ip = floating_ip_info.get('floating_ip')
self.__html_row(ip, row_span, col_span, self.colors[
'floating_ip'], ip.replace('.', ''))
for bridge in sorted(self.info['vms'][vm]['src_bridge']):
tag = get_vlan_tag(self.info, bridge)
ip = get_intf_ip(self.info, bridge)
color = self.__get_vlan_color(tag, ip)
if re.search('x.x.x.x', ip):
color = self.__get_color('error')
self.__html_row(ip, row_span, col_span,
color, ip.replace('.', ''))
self.__html_row_close()
self.__cluster_close()
pass
def __plot_linux_bridge(self):
row_span = 1
col_span = self.__get_total_vm_port_count()
self.__cluster_open('LinuxBridge')
self.__cluster_name('Linux Bridge', col_span)
# There must be one linuxbridge entity per VM port.
col_span = 1
# First, the tap devices
self.__html_row_open()
for vm in sorted(self.info['vms'].keys()):
for bridge in sorted(self.info['vms'][vm]['src_bridge']):
if self.info['brctl'].has_key(bridge):
for dev in self.info['brctl'][bridge]['interfaces']:
if re.search('^tap', dev):
tag = get_vlan_tag(self.info, bridge)
self.__html_row(dev, row_span, col_span,
self.__get_vlan_color(tag, dev), dev)
break
self.__html_row_close()
# Second, the linuxbridges
self.__html_row_open()
for vm in sorted(self.info['vms'].keys()):
for bridge in sorted(self.info['vms'][vm]['src_bridge']):
if self.info['brctl'].has_key(bridge):
tag = get_vlan_tag(self.info, bridge)
self.__html_row(bridge, row_span, col_span,
self.__get_vlan_color(tag, bridge), bridge)
self.__html_row_close()
# Third, the qvb (one part of eth-pair) devices
self.__html_row_open()
for vm in sorted(self.info['vms'].keys()):
for bridge in sorted(self.info['vms'][vm]['src_bridge']):
if self.info['brctl'].has_key(bridge):
for dev in self.info['brctl'][bridge]['interfaces']:
if re.search('^qvb', dev):
tag = get_vlan_tag(self.info, bridge)
self.__html_row(dev, row_span, col_span,
self.__get_vlan_color(tag, dev), dev)
break
self.__html_row_close()
self.__cluster_close()
pass
def __plot_br_int_compute(self):
br_int = self.info['bridges']['br-int']
row_span = 1
col_span = self.__get_total_vm_port_count()
self.__cluster_open('compute_br_int')
self.__cluster_name('OVS br_int', col_span)
# The qvo (pairs with qvb part in linuxbridge) devices
col_span = 1
self.__html_row_open()
for vm in sorted(self.info['vms'].keys()):
for bridge in sorted(self.info['vms'][vm]['src_bridge']):
qvo_port = bridge.replace('qbr', 'qvo')
if br_int['ports'].has_key(qvo_port):
port_id = '[' + br_int['ports'][qvo_port]['id'] + '] '
tag = br_int['ports'][qvo_port]['tag']
self.__html_row(port_id + qvo_port, row_span, col_span,
self.__get_vlan_color(tag, qvo_port), qvo_port)
self.__html_row_close()
# The vlan tags for each of the devices
col_span = 1
self.__html_row_open()
for vm in sorted(self.info['vms'].keys()):
for bridge in sorted(self.info['vms'][vm]['src_bridge']):
qvo_port = bridge.replace('qbr', 'qvo')
if br_int['ports'].has_key(qvo_port):
tag = br_int['ports'][qvo_port]['tag']
self.__html_row('VLAN tag:' + tag, row_span, col_span,
self.__get_vlan_color(tag), qvo_port + 'tag_' + tag)
self.__html_row_close()
col_span = self.__get_total_vm_port_count()
# Display the patch-tun port
self.__html_row_open()
tun_port = 'patch-tun'
if br_int['ports'].has_key(tun_port):
port_id = '[' + br_int['ports'][tun_port]['id'] + '] '
self.__html_row(port_id + tun_port, row_span, col_span,
self.__get_color('tun'), tun_port)
else:
self.__html_row(tun_port, row_span, col_span,
self.__get_color('error'), tun_port)
self.__html_row_close()
self.__cluster_close()
pass
# TODO
def __plot_br_ex_to_br_int(self):
namespaces = self.info['namespaces']
for nms in namespaces.keys():
if not re.search('^qrouter-', nms):
continue
if not namespaces[nms].has_key('interfaces'):
warning('namespace %s does not have any interface' % nms)
continue
qg_intf = None
for intf in namespaces[nms]['interfaces'].keys():
if re.search('^qg-', intf):
qg_intf = intf
break
for intf in namespaces[nms]['interfaces'].keys():
if re.search('^qr-', intf):
src_tag = 'br_ex:' + qg_intf
dst_tag = 'network_br_int:' + intf
self.__html_edge(src_tag, dst_tag,
self.__get_color('edge'))
pass
def __plot_br_ex_network(self):
routers = self.info['routers']
namespaces = self.info['namespaces']
br_ex = self.info['bridges']['br-ex']
row_span = 1
max_col_span = self.__get_total_port_count(port_type='qg')
self.__cluster_open('br_ex')
self.__cluster_name('OVS br_ex', max_col_span)
# Display the router name associated with each qg port
self.__html_row_open()
for router in sorted(routers.keys()):
col_span = self.__get_router_port_count(router, port_type='qg')
self.__html_row(router, row_span, col_span,
self.__get_color('routers'), router)
self.__html_row_close()
# Display the ips for each qg port
self.__html_row_open()
for router in sorted(routers.keys()):
col_span = self.__get_router_port_count(router, port_type='qg')
qrouter = 'qrouter-' + routers[router]['id']
for nms in namespaces.keys():
if re.search('^' + qrouter, nms):
for intf in namespaces[nms]['interfaces'].keys():
if re.search('^qg-', intf):
ip = namespaces[nms]['interfaces'][intf]
self.__html_row(ip, row_span, col_span,
self.__get_color('routers'), ip)
self.__html_row_close()
# For each router, print the qg- interfaces
self.__html_row_open()
for router in sorted(routers.keys()):
col_span = self.__get_router_port_count(router, port_type='qg')
qrouter = 'qrouter-' + routers[router]['id']
for nms in namespaces.keys():
if re.search('^' + qrouter, nms):
for intf in namespaces[nms]['interfaces'].keys():
if re.search('^qg-', intf):
port_id = '[' + br_ex['ports'][intf]['id'] + '] '
self.__html_row(port_id + intf, row_span, col_span,
self.__get_color('routers'), intf)
self.__html_row_close()
self.__cluster_close()
def __plot_br_int_network(self):
routers = self.info['routers']
namespaces = self.info['namespaces']
br_int = self.info['bridges']['br-int']
row_span = 1
# max_col_span = self.__get_total_port_count(port_type='qr') + \
# self.__get_total_dhcp_port_count()
max_col_span = self.__get_total_port_count(port_type='qr') * 2
col_span = max_col_span
self.__cluster_open('network_br_int')
self.__cluster_name('OVS br_int', col_span)
# For each router, print the qr- and tap (dhcp) interfaces
temp_info = []
col_span = 1
self.__html_row_open()
for router in sorted(routers.keys()):
qrouter = 'qrouter-' + routers[router]['id']
for nms in namespaces.keys():
if re.search('^' + qrouter, nms):
for intf in namespaces[nms]['interfaces'].keys():
if re.search('^qr-', intf):
tag = br_int['ports'][intf]['tag']
port_id = '[' + br_int['ports'][intf]['id'] + '] '
color = self.__get_vlan_color(tag, intf)
self.__html_row(
port_id + intf, row_span, col_span, color, intf)
# now plot the corresponding tap interface
(tap_nms, tap) = self.__get_tap_interface(nms, intf)
tag = br_int['ports'][tap]['tag']
color = self.__get_vlan_color(tag, tap)
port_id = '[' + br_int['ports'][tap]['id'] + '] '
self.__html_row(
port_id + tap, row_span, col_span, color, tap)
a = {
'qr_intf': intf,
'tap_intf': tap,
'qr_ip': namespaces[nms]['interfaces'][intf],
'tap_ip': namespaces[tap_nms]['interfaces'][tap],
}
temp_info.append(a)
self.__html_row_close()
# The vlan tags for each of the qr- and tap ports
col_span = 1
self.__html_row_open()
for entry in temp_info:
qr_intf = entry['qr_intf']
tap_intf = entry['tap_intf']
tag = br_int['ports'][qr_intf]['tag']
self.__html_row('VLAN tag:' + tag, row_span, col_span,
self.__get_vlan_color(tag), qr_intf + 'tag_' + tag)
tag = br_int['ports'][tap_intf]['tag']
self.__html_row('VLAN tag:' + tag, row_span, col_span,
self.__get_vlan_color(tag), tap_intf + 'tag_' + tag)
self.__html_row_close()
# Display the ips with each of the qr- and tap ports
self.__html_row_open()
for entry in temp_info:
qr_intf = entry['qr_intf']
qr_ip = entry['qr_ip']
tap_intf = entry['tap_intf']
tap_ip = entry['tap_ip']
tag = br_int['ports'][qr_intf]['tag']
self.__html_row(qr_ip, row_span, col_span,
self.__get_vlan_color(tag),
qr_intf + qr_ip)
tag = br_int['ports'][tap_intf]['tag']
self.__html_row(tap_ip, row_span, col_span,
self.__get_vlan_color(tag),
tap_intf + tap_ip)
self.__html_row_close()
# The network names (private1, private2, etc.)
col_span = 2
self.__html_row_open()
for entry in temp_info:
network_name = self.__get_network_name(entry['qr_ip'])
tag = br_int['ports'][entry['qr_intf']]['tag']
self.__html_row(network_name, row_span, col_span,
self.__get_vlan_color(tag), network_name)
self.__html_row_close()
# The routers in the system
self.__html_row_open()
for router in sorted(self.info['routers'].keys()):
# For each qr port that is also a tap port (for dhcp)
col_span = self.__get_router_port_count(router, port_type='qr') * 2
self.__html_row(router, row_span, col_span,
self.__get_color('routers'), router)
self.__html_row_close()
# Display the patch-tun port
self.__html_row_open()
tun_port = 'patch-tun'
debug('max_col_span 2: ' + str(max_col_span))
if br_int['ports'].has_key(tun_port):
port_id = '[' + br_int['ports'][tun_port]['id'] + '] '
self.__html_row(port_id + tun_port, row_span, max_col_span,
self.__get_color('tun'), tun_port)
else:
self.__html_row(tun_port, row_span, max_col_span,
self.__get_color('error'), tun_port)
self.__html_row_close()
self.__cluster_close()
def __plot_br_tun(self, tag):
br_tun = self.info['bridges']['br-tun']
row_span = 1
col_span = self.__get_total_vm_port_count()
self.__cluster_open(tag + '_br_tun')
self.__cluster_name('OVS br_tun', col_span)
# Display the patch-int port
col_span = self.__get_total_vm_port_count()
self.__html_row_open()
int_port = 'patch-int'
if br_tun['ports'].has_key(int_port):
port_id = '[' + br_tun['ports'][int_port]['id'] + '] '
self.__html_row(port_id + int_port, row_span,
col_span, self.__get_color('int'), int_port)
else:
self.__html_row(int_port, row_span, col_span,
self.__get_color('error'), int_port)
self.__html_row_close()
self.__cluster_close()
def __plot_vms_to_linuxbridge(self):
brctl = self.info['brctl']
for vm in sorted(self.info['vms'].keys()):
for bridge in sorted(self.info['vms'][vm]['src_bridge']):
ip = get_intf_ip(self.info, bridge)
if brctl.has_key(bridge):
for dev in brctl[bridge]['interfaces']:
if re.search('^tap', dev):
src_tag = 'VMs:' + ip.replace('.', '')
dst_tag = 'LinuxBridge:' + dev
color = self.__get_edge_color(src_tag, dst_tag)
self.__html_edge(src_tag, dst_tag, color)
break
pass
def __plot_linuxbridge_to_br_int(self):
brctl = self.info['brctl']
br_int = self.info['bridges']['br-int']
for vm in sorted(self.info['vms'].keys()):
for bridge in sorted(self.info['vms'][vm]['src_bridge']):
if brctl.has_key(bridge):
for dev in brctl[bridge]['interfaces']:
if re.search('^qvb', dev):
qvo_port = bridge.replace('qbr', 'qvo')
if br_int['ports'].has_key(qvo_port):
src_tag = 'LinuxBridge:' + dev
dst_tag = 'compute_br_int:' + qvo_port
color = self.__get_edge_color(src_tag, dst_tag)
self.__html_edge(src_tag, dst_tag, color)
break
pass
def __plot_br_int_to_br_tun(self, tag):
br_int = self.info['bridges']['br-int']['ports']
br_tun = self.info['bridges']['br-tun']['ports']
tun_port = 'patch-tun'
int_port = 'patch-int'
if br_int.has_key(tun_port) and br_tun.has_key(int_port):
tun_peer = br_int[tun_port]['interfaces'][
tun_port].get('options', None)
int_peer = br_tun[int_port]['interfaces'][
int_port].get('options', None)
if tun_peer and int_peer:
if re.search('peer=' + int_port, tun_peer) and \
re.search('peer=' + tun_port, int_peer):
src_tag = tag + '_br_int:' + tun_port
dst_tag = tag + '_br_tun:' + int_port
self.__html_edge(src_tag, dst_tag,
self.__get_color('edge'))
return
pass
def plot_combined(self):
self.outfile = open(self.combined_dot_file, 'w')
sys.stdout = self.outfile
tag = 'DON'
self.__digraph_open(tag)
self.__cluster_open_plain('DONComputeNode')
self.plot_compute_node()
self.__cluster_close_plain()
self.__cluster_open_plain('DONNetworkNode')
self.plot_network_node()
self.__cluster_close_plain()
self.__digraph_close()
self.outfile.close()
sys.stdout = sys.__stdout__
def plot_compute_node(self):
tag = 'compute'
redirected = False
if sys.stdout == sys.__stdout__:
self.outfile = open(self.compute_dot_file, "w")
sys.stdout = self.outfile
redirected = True
self.__digraph_open(tag)
# Title
self.__cluster_open('ComputeNode', 'red')
self.__cluster_name('Compute Node', 1, 'yellow')
self.__cluster_close()
# Plot nodes
self.__cluster_open_plain('Nova')
self.__plot_vms()
self.__plot_linux_bridge()
self.__cluster_close_plain()
self.__cluster_open_plain('OVS')
self.__plot_br_int_compute()
self.__plot_br_tun(tag)
self.__cluster_close_plain()
# Plot edges
self.__plot_title_edges(tag)
self.__plot_vms_to_linuxbridge()
self.__plot_linuxbridge_to_br_int()
self.__plot_br_int_to_br_tun(tag)
if redirected:
self.__digraph_close()
self.outfile.close()
sys.stdout = sys.__stdout__
def generate_compute_svg(self):
cmd = ['/usr/bin/dot', '-Tsvg', self.compute_dot_file,
'-o', self.compute_svg_file]
debug(pprint.pformat(cmd))
subprocess.call(cmd)
debug('Done generating compute SVG')
def plot_network_node(self):
tag = 'network'
redirected = False
if sys.stdout == sys.__stdout__:
self.outfile = open(self.network_dot_file, "w")
sys.stdout = self.outfile
redirected = True
self.__digraph_open(tag)
self.__cluster_open('NetworkNode', 'red')
self.__cluster_name('Network Node', 1, 'yellow')
self.__cluster_close()
# Plot nodes
self.__cluster_open_plain('OVS')
self.__plot_br_ex_network()
self.__plot_br_int_network()
self.__plot_br_tun(tag)
self.__cluster_close_plain()
# Plot edges
self.__plot_title_edges(tag)
self.__plot_br_int_to_br_tun(tag)
self.__plot_br_ex_to_br_int()
if redirected:
self.__digraph_close()
self.outfile.close()
sys.stdout = sys.__stdout__
def generate_network_svg(self):
cmd = ['/usr/bin/dot', '-Tsvg', self.network_dot_file,
'-o', self.network_svg_file]
debug(pprint.pformat(cmd))
subprocess.call(cmd)
debug('Done generating network SVG')
def generate_combined_svg(self):
cmd = ['/usr/bin/dot', '-Tsvg', self.combined_dot_file,
'-o', self.combined_svg_file]
debug(pprint.pformat(cmd))
subprocess.call(cmd)
debug('Done generating network SVG')
def check_args():
parser = argparse.ArgumentParser(description='Plot the compute node network internals',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('--debug', dest='debug',
help='Enable debugging', default=True, action='store_true')
parser.add_argument('--info_file', dest='info_file',
help='Info is read in JSON format in this file', default="don.json", type=str)
parser.add_argument('--compute_file', dest='compute_file',
help='[compute_file].dot and [compute_file].svg will be generated for compute node', default="compute", type=str)
parser.add_argument('--network_file', dest='network_file',
help='[network_file].dot and [network_file].svg will be generated for network node', default="network", type=str)
parser.add_argument('--combined_file', dest='combined_file',
help='[combined_file].dot and [combined_file].svg will be generated', default="don", type=str)
parser.add_argument('--highlight_file', dest='highlight_file',
help='pass and fail node are specified in this file', default=None, type=str)
args = parser.parse_args()
settings['debug'] = args.debug
settings['info_file'] = args.info_file
settings['compute_dot_file'] = args.compute_file + '.dot'
settings['compute_svg_file'] = args.compute_file + '.svg'
settings['network_dot_file'] = args.network_file + '.dot'
settings['network_svg_file'] = args.network_file + '.svg'
settings['combined_dot_file'] = args.combined_file + '.dot'
settings['combined_svg_file'] = args.combined_file + '.svg'
settings['highlight_file'] = args.highlight_file
def main():
check_args()
plotter = DotGenerator(settings['info_file'],
settings['compute_dot_file'],
settings['compute_svg_file'],
settings['network_dot_file'],
settings['network_svg_file'],
settings['combined_dot_file'],
settings['combined_svg_file'],
settings['highlight_file'],
)
if not settings['highlight_file']:
plotter.plot_compute_node()
plotter.generate_compute_svg()
plotter.plot_network_node()
plotter.generate_network_svg()
plotter.plot_combined()
plotter.generate_combined_svg()
if __name__ == "__main__":
main()

View File

@ -0,0 +1,92 @@
#
# run_nms_cmd.py: This needs to be run from inside appropriate namespace
#
# sudo ip netns exec qrouter-ac41aab2-f9c3-4a06-8eef-f909ee1e6e50 python # run_nms_cmd.py "command"
#
import argparse
import json
from common import connect_to_box, ssh_cmd
from common import settings
params = {}
output_dict = {
'comment': None,
'pass': None,
'command_list': [],
'errors': [],
}
def run_nms_cmd(args):
global output_dict
host_ip = args['host_ip']
username = args['username']
passwd = args['passwd']
cmd_to_run = args['cmd']
result = True
cmd_dict = {}
try:
ssh = connect_to_box(host_ip, username, passwd)
cmd_dict['cmd'] = 'ssh %s with provided username and passwd' % host_ip
if not ssh:
cmd_dict['output'] = 'Could not ssh to ' + host_ip
cmd_dict['pass'] = False
output_dict['command_list'].append(cmd_dict)
return False
else:
cmd_dict['pass'] = True
output_dict['command_list'].append(cmd_dict)
cmd_dict = {}
cmd = cmd_to_run
output = ssh_cmd(ssh, cmd).split('\n')
cmd_dict['cmd'] = cmd
cmd_dict['output'] = output
except (KeyboardInterrupt, SystemExit):
print '\nkeyboardinterrupt caught (again)'
print '\n...Program Stopped Manually!'
result = False
raise
cmd_dict['pass'] = result
output_dict['command_list'].append(cmd_dict)
return result
def check_args():
global params
parser = argparse.ArgumentParser(
description='Run command from inside nms', formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('--debug', dest='debug',
help='Enable debugging', default=False, action='store_true')
parser.add_argument('--host_ip', dest='host_ip',
help='IP where the command will be run', type=str, required=True)
parser.add_argument('--username', dest='username',
help='SSH login username (required)', type=str, required=True)
parser.add_argument('--passwd', dest='passwd',
help='SSH login passwd (required)', type=str, required=True)
parser.add_argument('--cmd', dest='cmd',
help='cmd to be run', type=str, required=True)
args = parser.parse_args()
settings['debug'] = args.debug
params['host_ip'] = args.host_ip
params['username'] = args.username
params['passwd'] = args.passwd
params['cmd'] = args.cmd
def main():
global output_dict
check_args()
output_dict['pass'] = run_nms_cmd(params)
a = json.dumps(output_dict, sort_keys=True, indent=4)
print a
if __name__ == "__main__":
main()

View File

@ -0,0 +1,152 @@
/*
CollapsibleLists.js
An object allowing lists to dynamically expand and collapse
Created by Stephen Morley - http://code.stephenmorley.org/ - and released under
the terms of the CC0 1.0 Universal legal code:
http://creativecommons.org/publicdomain/zero/1.0/legalcode
*/
// create the CollapsibleLists object
var CollapsibleLists =
new function(){
/* Makes all lists with the class 'collapsibleList' collapsible. The
* parameter is:
*
* doNotRecurse - true if sub-lists should not be made collapsible
*/
this.apply = function(doNotRecurse){
// loop over the unordered lists
var uls = document.getElementsByTagName('ul');
for (var index = 0; index < uls.length; index ++){
// check whether this list should be made collapsible
if (uls[index].className.match(/(^| )collapsibleList( |$)/)){
// make this list collapsible
this.applyTo(uls[index], true);
// check whether sub-lists should also be made collapsible
if (!doNotRecurse){
// add the collapsibleList class to the sub-lists
var subUls = uls[index].getElementsByTagName('ul');
for (var subIndex = 0; subIndex < subUls.length; subIndex ++){
subUls[subIndex].className += ' collapsibleList';
}
}
}
}
};
/* Makes the specified list collapsible. The parameters are:
*
* node - the list element
* doNotRecurse - true if sub-lists should not be made collapsible
*/
this.applyTo = function(node, doNotRecurse){
// loop over the list items within this node
var lis = node.getElementsByTagName('li');
for (var index = 0; index < lis.length; index ++){
// check whether this list item should be collapsible
if (!doNotRecurse || node == lis[index].parentNode){
// prevent text from being selected unintentionally
if (lis[index].addEventListener){
lis[index].addEventListener(
'mousedown', function (e){ e.preventDefault(); }, false);
}else{
lis[index].attachEvent(
'onselectstart', function(){ event.returnValue = false; });
}
// add the click listener
if (lis[index].addEventListener){
lis[index].addEventListener(
'click', createClickListener(lis[index]), false);
}else{
lis[index].attachEvent(
'onclick', createClickListener(lis[index]));
}
// close the unordered lists within this list item
toggle(lis[index]);
}
}
};
/* Returns a function that toggles the display status of any unordered
* list elements within the specified node. The parameter is:
*
* node - the node containing the unordered list elements
*/
function createClickListener(node){
// return the function
return function(e){
// ensure the event object is defined
if (!e) e = window.event;
// find the list item containing the target of the event
var li = (e.target ? e.target : e.srcElement);
while (li.nodeName != 'LI') li = li.parentNode;
// toggle the state of the node if it was the target of the event
if (li == node) toggle(node);
};
}
/* Opens or closes the unordered list elements directly within the
* specified node. The parameter is:
*
* node - the node containing the unordered list elements
*/
function toggle(node){
// determine whether to open or close the unordered lists
var open = node.className.match(/(^| )collapsibleListClosed( |$)/);
// loop over the unordered list elements with the node
var uls = node.getElementsByTagName('ul');
for (var index = 0; index < uls.length; index ++){
// find the parent list item of this unordered list
var li = uls[index];
while (li.nodeName != 'LI') li = li.parentNode;
// style the unordered list if it is directly within this node
if (li == node) uls[index].style.display = (open ? 'block' : 'none');
}
// remove the current class from the node
node.className =
node.className.replace(
/(^| )collapsibleList(Open|Closed)( |$)/, '');
// if the node contains unordered lists, set its class
if (uls.length > 0){
node.className += ' collapsibleList' + (open ? 'Open' : 'Closed');
}
}
}();

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 B

View File

@ -0,0 +1,21 @@
digraph DON_compute {
graph [fontsize=10 fontname="Helvetica"];
node [fontsize=10 fontname="Helvetica"];
rankdir = TB;
ranksep = 1;
concentrate = true;
compound = true;
edge [dir=none]
subgraph cluster_ComputeNode {
ComputeNode [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="red">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="yellow" PORT="ComputeNode">Compute Node</TD>
</TR>
</TABLE>>];
}
subgraph cluster_Nova {
style=filled

View File

@ -0,0 +1,111 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.36.0 (20140111.2315)
-->
<!-- Title: DON_compute Pages: 1 -->
<svg width="365pt" height="620pt"
viewBox="0.00 0.00 365.00 620.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 616)">
<title>DON_compute</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-616 361,-616 361,4 -4,4"/>
<g id="clust1" class="cluster"><title>cluster_ComputeNode</title>
<polygon fill="none" stroke="black" points="204,-548 204,-604 324,-604 324,-548 204,-548"/>
</g>
<g id="clust2" class="cluster"><title>cluster_Nova</title>
<polygon fill="lightgrey" stroke="black" points="87,-344 87,-500 349,-500 349,-344 87,-344"/>
</g>
<g id="clust3" class="cluster"><title>cluster_VMs</title>
<polygon fill="lightgrey" stroke="black" points="187,-352 187,-492 341,-492 341,-352 187,-352"/>
</g>
<g id="clust4" class="cluster"><title>cluster_LinuxBridge</title>
<polygon fill="lightgrey" stroke="black" points="95,-396 95,-448 179,-448 179,-396 95,-396"/>
</g>
<g id="clust5" class="cluster"><title>cluster_OVS</title>
<polygon fill="lightgrey" stroke="black" points="8,-8 8,-304 266,-304 266,-8 8,-8"/>
</g>
<g id="clust6" class="cluster"><title>cluster_compute_br_int</title>
<polygon fill="lightgrey" stroke="black" points="16,-156 16,-296 258,-296 258,-156 16,-156"/>
</g>
<g id="clust7" class="cluster"><title>cluster_compute_br_tun</title>
<polygon fill="lightgrey" stroke="black" points="81,-16 81,-100 193,-100 193,-16 81,-16"/>
</g>
<!-- ComputeNode -->
<g id="node1" class="node"><title>ComputeNode</title>
<polygon fill="red" stroke="none" points="220,-560 220,-592 308,-592 308,-560 220,-560"/>
<polygon fill="yellow" stroke="none" points="225,-565 225,-587 303,-587 303,-565 225,-565"/>
<text text-anchor="start" x="230.5" y="-573.5" font-family="Helvetica,sans-Serif" font-size="10.00">Compute Node</text>
</g>
<!-- VMs -->
<g id="node2" class="node"><title>VMs</title>
<polygon fill="white" stroke="none" points="203,-364 203,-480 325,-480 325,-364 203,-364"/>
<polygon fill="white" stroke="none" points="208,-453 208,-475 320,-475 320,-453 208,-453"/>
<text text-anchor="start" x="253.5" y="-461.5" font-family="Helvetica,sans-Serif" font-size="10.00">VMs</text>
<polygon fill="#ff9933" stroke="none" points="208,-425 208,-448 262,-448 262,-425 208,-425"/>
<polygon fill="none" stroke="black" points="208,-425 208,-448 262,-448 262,-425 208,-425"/>
<text text-anchor="start" x="225.5" y="-434" font-family="Helvetica,sans-Serif" font-size="10.00">vm1</text>
<polygon fill="#ff9933" stroke="none" points="267,-425 267,-448 320,-448 320,-425 267,-425"/>
<polygon fill="none" stroke="black" points="267,-425 267,-448 320,-448 320,-425 267,-425"/>
<text text-anchor="start" x="284" y="-434" font-family="Helvetica,sans-Serif" font-size="10.00">vm2</text>
<polygon fill="#c079f3" stroke="none" points="208,-397 208,-420 262,-420 262,-397 208,-397"/>
<polygon fill="none" stroke="black" points="208,-397 208,-420 262,-420 262,-397 208,-397"/>
<text text-anchor="start" x="217.5" y="-406" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#c079f3" stroke="none" points="267,-397 267,-420 320,-420 320,-397 267,-397"/>
<polygon fill="none" stroke="black" points="267,-397 267,-420 320,-420 320,-397 267,-397"/>
<text text-anchor="start" x="276" y="-406" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#c079f3" stroke="none" points="208,-369 208,-392 262,-392 262,-369 208,-369"/>
<polygon fill="none" stroke="black" points="208,-369 208,-392 262,-392 262,-369 208,-369"/>
<text text-anchor="start" x="214.5" y="-378" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.3</text>
<polygon fill="#c079f3" stroke="none" points="267,-369 267,-392 320,-392 320,-369 267,-369"/>
<polygon fill="none" stroke="black" points="267,-369 267,-392 320,-392 320,-369 267,-369"/>
<text text-anchor="start" x="273" y="-378" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.4</text>
</g>
<!-- ComputeNode&#45;&gt;VMs -->
<!-- LinuxBridge -->
<g id="node3" class="node"><title>LinuxBridge</title>
<text text-anchor="middle" x="137" y="-419.5" font-family="Helvetica,sans-Serif" font-size="10.00">LinuxBridge</text>
</g>
<!-- compute_br_int -->
<g id="node4" class="node"><title>compute_br_int</title>
<polygon fill="white" stroke="none" points="32,-168 32,-284 242,-284 242,-168 32,-168"/>
<polygon fill="white" stroke="none" points="37,-257 37,-279 237,-279 237,-257 37,-257"/>
<text text-anchor="start" x="112.5" y="-265.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_int</text>
<polygon fill="#c079f3" stroke="none" points="37,-229 37,-252 136,-252 136,-229 37,-229"/>
<polygon fill="none" stroke="black" points="37,-229 37,-252 136,-252 136,-229 37,-229"/>
<text text-anchor="start" x="43.5" y="-238" font-family="Helvetica,sans-Serif" font-size="10.00">[6] qvo8aa60600&#45;7b</text>
<polygon fill="#c079f3" stroke="none" points="141,-229 141,-252 237,-252 237,-229 141,-229"/>
<polygon fill="none" stroke="black" points="141,-229 141,-252 237,-252 237,-229 141,-229"/>
<text text-anchor="start" x="147" y="-238" font-family="Helvetica,sans-Serif" font-size="10.00">[7] qvo71ac5bef&#45;7c</text>
<polygon fill="#c079f3" stroke="none" points="37,-201 37,-224 136,-224 136,-201 37,-201"/>
<polygon fill="none" stroke="black" points="37,-201 37,-224 136,-224 136,-201 37,-201"/>
<text text-anchor="start" x="60.5" y="-210" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="141,-201 141,-224 237,-224 237,-201 141,-201"/>
<polygon fill="none" stroke="black" points="141,-201 141,-224 237,-224 237,-201 141,-201"/>
<text text-anchor="start" x="163" y="-210" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#ffcc00" stroke="none" points="37,-173 37,-196 237,-196 237,-173 37,-173"/>
<polygon fill="none" stroke="black" points="37,-173 37,-196 237,-196 237,-173 37,-173"/>
<text text-anchor="start" x="109.5" y="-182" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;tun</text>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge2" class="edge"><title>LinuxBridge:qvb8aa60600_7b:s&#45;&gt;compute_br_int:qvo8aa60600_7b:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M128.116,-403.866C113.505,-374.046 86,-310.304 86,-253"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge3" class="edge"><title>LinuxBridge:qvb71ac5bef_7c:s&#45;&gt;compute_br_int:qvo71ac5bef_7c:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M146.058,-403.886C160.956,-374.097 189,-310.4 189,-253"/>
</g>
<!-- compute_br_tun -->
<g id="node5" class="node"><title>compute_br_tun</title>
<polygon fill="white" stroke="none" points="97,-28 97,-88 177,-88 177,-28 97,-28"/>
<polygon fill="white" stroke="none" points="102,-61 102,-83 172,-83 172,-61 102,-61"/>
<text text-anchor="start" x="111" y="-69.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_tun</text>
<polygon fill="#ffcc00" stroke="none" points="102,-33 102,-56 172,-56 172,-33 102,-33"/>
<polygon fill="none" stroke="black" points="102,-33 102,-56 172,-56 172,-33 102,-33"/>
<text text-anchor="start" x="111" y="-42" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;int</text>
</g>
<!-- compute_br_int&#45;&gt;compute_br_tun -->
<g id="edge4" class="edge"><title>compute_br_int:patch_tun:s&#45;&gt;compute_br_tun:patch_int:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M137,-172C137,-120.889 137,-108.111 137,-57"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@ -0,0 +1,31 @@
<!DOCTYPE html>
<html>
<head>
<title>DON: Internal View</title>
<link rel="stylesheet" type="text/css" href="don.css">
</head>
<body>
<div id="internal">
<table width="100%">
<th class="title">
DON: Internal View
</th>
<tr>
<td align="center" class="clickme">
<button class="myButton"
onClick="location.href='http://127.0.0.1:8000/don/analyze'">
Analyze</button>
&nbsp;&nbsp;&nbsp;
<button class="myButton"
onClick="location.href='http://127.0.0.1:8000/don/ping'">
Ping Tracer</button>
</td>
</tr>
<tr>
<td><object class="emb" data="don.svg" width="100%" height="850" type="image/svg+xml" id="don_svg"></object></td>
</tr>
</table>
</div>
</body>
</html>

View File

@ -0,0 +1,212 @@
body {
font-family: "Courier New", Helvetica, "Times New Roman",
Times, serif;
color: black;
background-color: #ffffff
}
pre {
width: 500px; /* specify width */
white-space: pre-wrap; /* CSS3 browsers */
white-space: -moz-pre-wrap !important; /* 1999+ Mozilla */
white-space: -pre-wrap; /* Opera 4 thru 6 */
white-space: -o-pre-wrap; /* Opera 7 and up */
/* word-wrap: break-word; */ /* IE 5.5+ and up */
font-family: "Courier New", monospace;
line-height: 1.6em;
margin: 1.7em 0 1.7em 0.3em;
font-size: 12px;
/* overflow-x: auto; */ /* Firefox 2 only */
width: 90%; /* only if needed */
}
h2 {
font-family: Georgia, Helvetica,san-Serif;
font-weight: bold;
font-size: 20pt;
/*color:#fffff0;*/
color: #2A4E68;
padding: 5px;
margin: 20px 0px 0px 0px;
/*background:#3399ff;*/
/*border-radius: 20px;*/
/*
font-family: "Helvetica Neue", Helvetica, Geneva, Arial,
SunSans-Regular, sans-serif;
padding: 0px;
font-weight: normal;
color: #2A4E68;
border-top: 1px solid black;
#border-bottom: 0.5px solid black;
#background: #ff9933;
#border-radius: 10px;
width:750px;
*/
}
h3 {
font-family: "Helvetica Neue", Helvetica, Geneva, Arial,
SunSans-Regular, sans-serif;
margin: 0px 0px 0px 0px;
padding: 5px;
font-weight: normal;
font-style: italic;
color: #ff9933;
border-bottom: 0.5px solid black;
width:750px; /*Change this to whatever value that you want*/
}
pre.pass {
border-left: 2px solid #009900;
}
pre.fail {
border-left: 2px solid #f00000;
}
font.pass {color:#00cc00; text-decoration:none;}
font.fail {color:#f00000; font-weight:bold; text-decoration:none;}
.collapsibleList li{
list-style-image:url('button.png');
cursor:auto;
margin:0 0 5px 0;
}
li.collapsibleListOpen{
list-style-image:url('button-open.png');
cursor:pointer;
margin:0 0 5px 0;
}
li.collapsibleListClosed{
list-style-image:url('button-closed.png');
cursor:pointer;
}
.message {
position: absolute;
display: none;
border: 0px solid red;
width:80px;
height:80px;
padding: 0px;
float: top;
font-size: 8pt;
}
#main {
width:1000px;
float:left;
border: 0px solid red;
}
#internal {
width:1800px;
float:left;
border: 0px solid red;
}
table
{
font-family: Helvetica,san-Serif;
font-weight: normal;
font-size: large;
border: 0px solid blue;
padding: 0px;
border-spacing:0px;
border-collapse:collapse;
}
th {
font-family: Georgia, Helvetica,san-Serif;
font-weight: bold;
font-size: 20pt;
/*color:#fffff0;*/
color: #2A4E68;
padding: 5px;
/*background:#3399ff;*/
/*border-radius: 20px;*/
}
tr {
font-family: Helvetica,san-Serif;
font-weight: normal;
font-size: large;
padding: 0px;
vertical-align: top;
}
td {
font-family: Helvetica,san-Serif;
font-weight: normal;
font-size: large;
vertical-align: middle;
padding: 5px;
border-style: solid;
border-width: 0px;
border-color: black;
}
td.clickme {
font-family: Helvetica,san-Serif;
font-weight: normal;
font-size: large;
vertical-align: bottom;
padding: 20px;
/*background:#e5e5e5;*/
background:#ffffff;
border-radius: 15px;
border-style: solid;
border-width: 0px;
border-color: black;
text-align: center;
}
.myButton {
-moz-box-shadow: 0px 10px 14px -7px #3e7327;
-webkit-box-shadow: 0px 10px 14px -7px #3e7327;
box-shadow: 0px 10px 14px -7px #3e7327;
background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #77b55a), color-stop(1, #72b352));
background:-moz-linear-gradient(top, #77b55a 5%, #72b352 100%);
background:-webkit-linear-gradient(top, #77b55a 5%, #72b352 100%);
background:-o-linear-gradient(top, #77b55a 5%, #72b352 100%);
background:-ms-linear-gradient(top, #77b55a 5%, #72b352 100%);
background:linear-gradient(to bottom, #77b55a 5%, #72b352 100%);
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#77b55a', endColorstr='#72b352',GradientType=0);
background-color:#77b55a;
-moz-border-radius:4px;
-webkit-border-radius:4px;
border-radius:4px;
border:1px solid #4b8f29;
display:inline-block;
cursor:pointer;
color:#ffffff;
font-family:Arial;
font-size:20px;
font-weight:bold;
padding:6px 12px;
text-decoration:none;
text-shadow:0px 1px 0px #5b8a3c;
}
.myButton:hover {
background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #72b352), color-stop(1, #77b55a));
background:-moz-linear-gradient(top, #72b352 5%, #77b55a 100%);
background:-webkit-linear-gradient(top, #72b352 5%, #77b55a 100%);
background:-o-linear-gradient(top, #72b352 5%, #77b55a 100%);
background:-ms-linear-gradient(top, #72b352 5%, #77b55a 100%);
background:linear-gradient(to bottom, #72b352 5%, #77b55a 100%);
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#72b352', endColorstr='#77b55a',GradientType=0);
background-color:#72b352;
}
.myButton:active {
position:relative;
top:1px;
}

View File

@ -0,0 +1,198 @@
digraph DON_DON {
graph [fontsize=10 fontname="Helvetica"];
node [fontsize=10 fontname="Helvetica"];
rankdir = TB;
ranksep = 1;
concentrate = true;
compound = true;
edge [dir=none]
subgraph cluster_DONComputeNode {
style=filled
subgraph cluster_ComputeNode {
ComputeNode [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="red">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="yellow" PORT="ComputeNode">Compute Node</TD>
</TR>
</TABLE>>];
}
subgraph cluster_Nova {
style=filled
subgraph cluster_VMs {
VMs [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="VMs">VMs</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933">vm1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933">vm2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3">private1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3">private1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="101003">10.10.0.3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="101004">10.10.0.4</TD>
</TR>
</TABLE>>];
}
subgraph cluster_LinuxBridge {
LinuxBridge [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="LinuxBridge">Linux Bridge</TD>
</TR>
<TR>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qbr8aa60600_7b">qbr8aa60600-7b</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qbr71ac5bef_7c">qbr71ac5bef-7c</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvb8aa60600_7b">qvb8aa60600-7b</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvb71ac5bef_7c">qvb71ac5bef-7c</TD>
</TR>
</TABLE>>];
}
}
subgraph cluster_OVS {
style=filled
subgraph cluster_compute_br_int {
compute_br_int [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_int">OVS br_int</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvo8aa60600_7b">[6] qvo8aa60600-7b</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvo71ac5bef_7c">[7] qvo71ac5bef-7c</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvo8aa60600_7btag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvo71ac5bef_7ctag_2">VLAN tag:2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ffcc00" PORT="patch_tun">[1] patch-tun</TD>
</TR>
</TABLE>>];
}
subgraph cluster_compute_br_tun {
compute_br_tun [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_tun">OVS br_tun</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ffcc00" PORT="patch_int">[1] patch-int</TD>
</TR>
</TABLE>>];
}
}
ComputeNode:s -> VMs:n [color = "#0066cc", penwidth = "4", style="invis"]
LinuxBridge:qvb8aa60600_7b:s -> compute_br_int:qvo8aa60600_7b:n [color = "#0066cc", penwidth = "4"]
LinuxBridge:qvb71ac5bef_7c:s -> compute_br_int:qvo71ac5bef_7c:n [color = "#0066cc", penwidth = "4"]
compute_br_int:patch_tun:s -> compute_br_tun:patch_int:n [color = "#0066cc", penwidth = "4"]
}
subgraph cluster_DONNetworkNode {
style=filled
subgraph cluster_NetworkNode {
NetworkNode [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="red">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="yellow" PORT="NetworkNode">Network Node</TD>
</TR>
</TABLE>>];
}
subgraph cluster_OVS {
style=filled
subgraph cluster_br_ex {
br_ex [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="white" PORT="OVSbr_ex">OVS br_ex</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="router1">router1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="172.24.4.3/24">172.24.4.3/24</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="qg_757bf552_73">[2] qg-757bf552-73</TD>
</TR>
</TABLE>>];
}
subgraph cluster_network_br_int {
network_br_int [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_int">OVS br_int</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_43b83157_3b">[8] qr-43b83157-3b</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tap59f90a3b_f5">[5] tap59f90a3b-f5</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_43b83157_3btag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tap59f90a3b_f5tag_2">VLAN tag:2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_43b83157_3b10.10.0.1/24">10.10.0.1/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tap59f90a3b_f510.10.0.2/24">10.10.0.2/24</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#c079f3" PORT="private1">private1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ff9933" PORT="router1">router1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ffcc00" PORT="patch_tun">[1] patch-tun</TD>
</TR>
</TABLE>>];
}
subgraph cluster_network_br_tun {
network_br_tun [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_tun">OVS br_tun</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ffcc00" PORT="patch_int">[1] patch-int</TD>
</TR>
</TABLE>>];
}
}
NetworkNode:s -> br_ex:n [color = "#0066cc", penwidth = "4", style="invis"]
network_br_int:patch_tun:s -> network_br_tun:patch_int:n [color = "#0066cc", penwidth = "4"]
br_ex:qg_757bf552_73:s -> network_br_int:qr_43b83157_3b:n [color = "#0066cc", penwidth = "4"]
}
}

View File

@ -0,0 +1,31 @@
<!DOCTYPE html>
<html>
<head>
<title>DON: Diagnosing OpenStack Networking</title>
<link rel="stylesheet" type="text/css" href="don.css">
</head>
<body>
<div id="main">
<table width="100%" border-spacing="10px">
<th class="title">
DON: Diagnosing OpenStack Networking
</th>
<tr>
<td align="center" class="clickme">
<button class="myButton"
onClick="location.href='http://127.0.0.1:8000/don/view'">
Visualize</button>
</td>
</tr>
<!--
<tr>
<td align="center">
<img src="openstack-cloud-software-vertical-web.png"
alt="OpenStack Logo">
</td>
</tr>
-->
</table>
</div>
</body>
</html>

View File

@ -0,0 +1,144 @@
<html>
<head>
<script type="text/javascript" src="CollapsibleLists.js"></script>
<link rel="stylesheet" type="text/css" href="don.css">
<title>DON: Analysis Results</title>
</head>
<body onload=CollapsibleLists.apply()>
<h2>OVS Test Results</h2>
<h3>OVS test between all pairs of ports using the same tag in br-int</h3>
<ul class="collapsibleList">
<li>OVS bridge br-int
<ul class="collapsibleList">
<li>tag 2
<ul class="collapsibleList">
<li> 6 &rarr; 7 <font class="fail">&#10008;</font>
<ul class="collapsibleList">
<pre class="fail">
'sudo ovs-appctl fdb/flush br-int'
'sudo ovs-appctl ofproto/trace br-int in_port=6,dl_src=AA:BB:CC:DD:EE:11,dl_dst=AA:BB:CC:DD:EE:22 -generate'
'sudo ovs-appctl fdb/show br-int'
'sudo ovs-appctl ofproto/trace br-int in_port=7,dl_src=AA:BB:CC:DD:EE:22,dl_dst=AA:BB:CC:DD:EE:11 -generate'
{
"command_list": [
{
"cmd": "sudo ovs-appctl fdb/flush br-int",
"output": [
"table successfully flushed",
""
]
},
{
"cmd": "sudo ovs-appctl ofproto/trace br-int in_port=6,dl_src=AA:BB:CC:DD:EE:11,dl_dst=AA:BB:CC:DD:EE:22 -generate",
"output": [
"Flow: metadata=0,in_port=6,vlan_tci=0x0000,dl_src=aa:bb:cc:dd:ee:11,dl_dst=aa:bb:cc:dd:ee:22,dl_type=0x0000",
"Rule: table=0 cookie=0x9ecb964f4eaf403e priority=0",
"OpenFlow actions=NORMAL",
"no learned MAC for destination, flooding",
"",
" Resubmitted flow: metadata=0,in_port=1,dl_vlan=2,dl_vlan_pcp=0,dl_src=aa:bb:cc:dd:ee:11,dl_dst=aa:bb:cc:dd:ee:22,dl_type=0x0000",
" Resubmitted regs: reg0=0x0 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0",
" Resubmitted odp: push_vlan(vid=2,pcp=0),5,6,pop_vlan,7,9",
" Rule: table=0 cookie=0x9ecb964f4eaf403e priority=1,in_port=1",
" OpenFlow actions=resubmit(,2)",
"",
" Resubmitted flow: unchanged",
" Resubmitted regs: reg0=0x0 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0",
" Resubmitted odp: push_vlan(vid=2,pcp=0),5,6,pop_vlan,7,9",
" Rule: table=2 cookie=0x9ecb964f4eaf403e priority=0,dl_dst=00:00:00:00:00:00/01:00:00:00:00:00",
" OpenFlow actions=resubmit(,20)",
"",
" Resubmitted flow: unchanged",
" Resubmitted regs: reg0=0x0 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0",
" Resubmitted odp: push_vlan(vid=2,pcp=0),5,6,pop_vlan,7,9",
" Rule: table=20 cookie=0x9ecb964f4eaf403e priority=0",
" OpenFlow actions=resubmit(,22)",
"",
" Resubmitted flow: unchanged",
" Resubmitted regs: reg0=0x0 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0",
" Resubmitted odp: push_vlan(vid=2,pcp=0),5,6,pop_vlan,7,9",
" Rule: table=22 cookie=0x9ecb964f4eaf403e priority=0",
" OpenFlow actions=drop",
"",
"Final flow: metadata=0,in_port=6,vlan_tci=0x0000,dl_src=aa:bb:cc:dd:ee:11,dl_dst=aa:bb:cc:dd:ee:22,dl_type=0x0000",
"Relevant fields: skb_priority=0,in_port=6,vlan_tci=0x0000,dl_src=aa:bb:cc:dd:ee:11,dl_dst=aa:bb:cc:dd:ee:22,dl_type=0x0000,nw_proto=0,nw_frag=no,tp_src=0",
"Datapath actions: push_vlan(vid=2,pcp=0),5,6,pop_vlan,7,9,12",
""
]
},
{
"cmd": "sudo ovs-appctl fdb/show br-int",
"output": [
" port VLAN MAC Age",
" 6 2 aa:bb:cc:dd:ee:11 0",
""
]
},
{
"cmd": "sudo ovs-appctl ofproto/trace br-int in_port=7,dl_src=AA:BB:CC:DD:EE:22,dl_dst=AA:BB:CC:DD:EE:11 -generate",
"output": [
"Flow: metadata=0,in_port=7,vlan_tci=0x0000,dl_src=aa:bb:cc:dd:ee:22,dl_dst=aa:bb:cc:dd:ee:11,dl_type=0x0000",
"Rule: table=0 cookie=0x9ecb964f4eaf403e priority=0",
"OpenFlow actions=NORMAL",
"forwarding to learned port",
"",
"Final flow: unchanged",
"Relevant fields: skb_priority=0,in_port=7,vlan_tci=0x0000/0x1fff,dl_src=aa:bb:cc:dd:ee:22,dl_dst=aa:bb:cc:dd:ee:11,dl_type=0x0000,nw_proto=0,nw_frag=no,tp_src=0",
"Datapath actions: 11",
""
]
}
],
"comment": "ovs br-int port 6 --> 7",
"debugs": [
"AA:BB:CC:DD:EE:11 learnt on expected vlan 2 on port 6",
"Packet for learnt mac forwarded properly"
],
"errors": [
"Packet forwarded to incorrect port 11, expected 6"
],
"pass": false
}
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
OVERALL RESULT: <font class="fail">&#10008;</font>
<h2>Ping Test Results</h2>
<h3>Ping test between all pairs of VMs</h3>
<ul class="collapsibleList">
<li>router1 (Namespace [qrouter-90111551-6cfc-4be0-b1c2-ce8bffb7edf6])
<ul class="collapsibleList">
<li>vm1 &rarr; vm2
<ul class="collapsibleList">
<li> 10.10.0.3 &rarr; 10.10.0.4 <font class="fail">&#10008;</font>
<ul class="collapsibleList">
<pre class="fail">
{
"command_list": [
{
"cmd": "ssh 10.10.0.3 with provided username and passwd",
"output": "Could not ssh to 10.10.0.3",
"pass": false
}
],
"comment": "PING 10.10.0.3 to 10.10.0.4",
"errors": [],
"pass": false
}
</pre>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
OVERALL RESULT: <font class="fail">&#10008;</font>
</body>
</html>

View File

@ -0,0 +1,204 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.36.0 (20140111.2315)
-->
<!-- Title: DON_DON Pages: 1 -->
<svg width="576pt" height="720pt"
viewBox="0.00 0.00 576.00 720.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 716)">
<title>DON_DON</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-716 572,-716 572,4 -4,4"/>
<g id="clust1" class="cluster"><title>cluster_DONComputeNode</title>
<polygon fill="lightgrey" stroke="black" points="8,-8 8,-704 286,-704 286,-8 8,-8"/>
</g>
<g id="clust2" class="cluster"><title>cluster_ComputeNode</title>
<polygon fill="lightgrey" stroke="black" points="133,-640 133,-696 253,-696 253,-640 133,-640"/>
</g>
<g id="clust3" class="cluster"><title>cluster_Nova</title>
<polygon fill="lightgrey" stroke="black" points="16,-436 16,-592 278,-592 278,-436 16,-436"/>
</g>
<g id="clust4" class="cluster"><title>cluster_VMs</title>
<polygon fill="lightgrey" stroke="black" points="116,-444 116,-584 270,-584 270,-444 116,-444"/>
</g>
<g id="clust5" class="cluster"><title>cluster_LinuxBridge</title>
<polygon fill="lightgrey" stroke="black" points="24,-488 24,-540 108,-540 108,-488 24,-488"/>
</g>
<g id="clust6" class="cluster"><title>cluster_OVS</title>
<polygon fill="lightgrey" stroke="black" points="16,-16 16,-354 274,-354 274,-16 16,-16"/>
</g>
<g id="clust7" class="cluster"><title>cluster_compute_br_int</title>
<polygon fill="lightgrey" stroke="black" points="24,-206 24,-346 266,-346 266,-206 24,-206"/>
</g>
<g id="clust8" class="cluster"><title>cluster_compute_br_tun</title>
<polygon fill="lightgrey" stroke="black" points="89,-24 89,-108 201,-108 201,-24 89,-24"/>
</g>
<g id="clust9" class="cluster"><title>cluster_DONNetworkNode</title>
<polygon fill="lightgrey" stroke="black" points="294,-8 294,-704 560,-704 560,-8 294,-8"/>
</g>
<g id="clust11" class="cluster"><title>cluster_OVS</title>
<polygon fill="lightgrey" stroke="black" points="302,-16 302,-592 552,-592 552,-16 302,-16"/>
</g>
<g id="clust12" class="cluster"><title>cluster_br_ex</title>
<polygon fill="lightgrey" stroke="black" points="310,-444 310,-584 448,-584 448,-444 310,-444"/>
</g>
<g id="clust13" class="cluster"><title>cluster_network_br_int</title>
<polygon fill="lightgrey" stroke="black" points="310,-164 310,-388 544,-388 544,-164 310,-164"/>
</g>
<g id="clust14" class="cluster"><title>cluster_network_br_tun</title>
<polygon fill="lightgrey" stroke="black" points="372,-24 372,-108 484,-108 484,-24 372,-24"/>
</g>
<g id="clust10" class="cluster"><title>cluster_NetworkNode</title>
<polygon fill="lightgrey" stroke="black" points="320,-640 320,-696 438,-696 438,-640 320,-640"/>
</g>
<!-- ComputeNode -->
<g id="node1" class="node"><title>ComputeNode</title>
<polygon fill="red" stroke="none" points="149,-652 149,-684 237,-684 237,-652 149,-652"/>
<polygon fill="yellow" stroke="none" points="154,-657 154,-679 232,-679 232,-657 154,-657"/>
<text text-anchor="start" x="159.5" y="-665.5" font-family="Helvetica,sans-Serif" font-size="10.00">Compute Node</text>
</g>
<!-- VMs -->
<g id="node2" class="node"><title>VMs</title>
<polygon fill="white" stroke="none" points="132,-456 132,-572 254,-572 254,-456 132,-456"/>
<polygon fill="white" stroke="none" points="137,-545 137,-567 249,-567 249,-545 137,-545"/>
<text text-anchor="start" x="182.5" y="-553.5" font-family="Helvetica,sans-Serif" font-size="10.00">VMs</text>
<polygon fill="#ff9933" stroke="none" points="137,-517 137,-540 191,-540 191,-517 137,-517"/>
<polygon fill="none" stroke="black" points="137,-517 137,-540 191,-540 191,-517 137,-517"/>
<text text-anchor="start" x="154.5" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">vm1</text>
<polygon fill="#ff9933" stroke="none" points="196,-517 196,-540 249,-540 249,-517 196,-517"/>
<polygon fill="none" stroke="black" points="196,-517 196,-540 249,-540 249,-517 196,-517"/>
<text text-anchor="start" x="213" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">vm2</text>
<polygon fill="#c079f3" stroke="none" points="137,-489 137,-512 191,-512 191,-489 137,-489"/>
<polygon fill="none" stroke="black" points="137,-489 137,-512 191,-512 191,-489 137,-489"/>
<text text-anchor="start" x="146.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#c079f3" stroke="none" points="196,-489 196,-512 249,-512 249,-489 196,-489"/>
<polygon fill="none" stroke="black" points="196,-489 196,-512 249,-512 249,-489 196,-489"/>
<text text-anchor="start" x="205" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#c079f3" stroke="none" points="137,-461 137,-484 191,-484 191,-461 137,-461"/>
<polygon fill="none" stroke="black" points="137,-461 137,-484 191,-484 191,-461 137,-461"/>
<text text-anchor="start" x="143.5" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.3</text>
<polygon fill="#c079f3" stroke="none" points="196,-461 196,-484 249,-484 249,-461 196,-461"/>
<polygon fill="none" stroke="black" points="196,-461 196,-484 249,-484 249,-461 196,-461"/>
<text text-anchor="start" x="202" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.4</text>
</g>
<!-- ComputeNode&#45;&gt;VMs -->
<!-- LinuxBridge -->
<g id="node3" class="node"><title>LinuxBridge</title>
<text text-anchor="middle" x="66" y="-511.5" font-family="Helvetica,sans-Serif" font-size="10.00">LinuxBridge</text>
</g>
<!-- compute_br_int -->
<g id="node4" class="node"><title>compute_br_int</title>
<polygon fill="white" stroke="none" points="40,-218 40,-334 250,-334 250,-218 40,-218"/>
<polygon fill="white" stroke="none" points="45,-307 45,-329 245,-329 245,-307 45,-307"/>
<text text-anchor="start" x="120.5" y="-315.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_int</text>
<polygon fill="#c079f3" stroke="none" points="45,-279 45,-302 144,-302 144,-279 45,-279"/>
<polygon fill="none" stroke="black" points="45,-279 45,-302 144,-302 144,-279 45,-279"/>
<text text-anchor="start" x="51.5" y="-288" font-family="Helvetica,sans-Serif" font-size="10.00">[6] qvo8aa60600&#45;7b</text>
<polygon fill="#c079f3" stroke="none" points="149,-279 149,-302 245,-302 245,-279 149,-279"/>
<polygon fill="none" stroke="black" points="149,-279 149,-302 245,-302 245,-279 149,-279"/>
<text text-anchor="start" x="155" y="-288" font-family="Helvetica,sans-Serif" font-size="10.00">[7] qvo71ac5bef&#45;7c</text>
<polygon fill="#c079f3" stroke="none" points="45,-251 45,-274 144,-274 144,-251 45,-251"/>
<polygon fill="none" stroke="black" points="45,-251 45,-274 144,-274 144,-251 45,-251"/>
<text text-anchor="start" x="68.5" y="-260" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="149,-251 149,-274 245,-274 245,-251 149,-251"/>
<polygon fill="none" stroke="black" points="149,-251 149,-274 245,-274 245,-251 149,-251"/>
<text text-anchor="start" x="171" y="-260" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#ffcc00" stroke="none" points="45,-223 45,-246 245,-246 245,-223 45,-223"/>
<polygon fill="none" stroke="black" points="45,-223 45,-246 245,-246 245,-223 45,-223"/>
<text text-anchor="start" x="117.5" y="-232" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;tun</text>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge2" class="edge"><title>LinuxBridge:qvb8aa60600_7b:s&#45;&gt;compute_br_int:qvo8aa60600_7b:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M69.8346,-495.954C77.5031,-460.323 94,-375.275 94,-303"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge3" class="edge"><title>LinuxBridge:qvb71ac5bef_7c:s&#45;&gt;compute_br_int:qvo71ac5bef_7c:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M76.0841,-495.784C85.3069,-480.12 99.3923,-456.399 112,-436 148.882,-376.326 197,-373.152 197,-303"/>
</g>
<!-- compute_br_tun -->
<g id="node5" class="node"><title>compute_br_tun</title>
<polygon fill="white" stroke="none" points="105,-36 105,-96 185,-96 185,-36 105,-36"/>
<polygon fill="white" stroke="none" points="110,-69 110,-91 180,-91 180,-69 110,-69"/>
<text text-anchor="start" x="119" y="-77.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_tun</text>
<polygon fill="#ffcc00" stroke="none" points="110,-41 110,-64 180,-64 180,-41 110,-41"/>
<polygon fill="none" stroke="black" points="110,-41 110,-64 180,-64 180,-41 110,-41"/>
<text text-anchor="start" x="119" y="-50" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;int</text>
</g>
<!-- compute_br_int&#45;&gt;compute_br_tun -->
<g id="edge4" class="edge"><title>compute_br_int:patch_tun:s&#45;&gt;compute_br_tun:patch_int:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M145,-222C145,-152.222 145,-134.778 145,-65"/>
</g>
<!-- NetworkNode -->
<g id="node6" class="node"><title>NetworkNode</title>
<polygon fill="red" stroke="none" points="336.5,-652 336.5,-684 421.5,-684 421.5,-652 336.5,-652"/>
<polygon fill="yellow" stroke="none" points="342,-657 342,-679 417,-679 417,-657 342,-657"/>
<text text-anchor="start" x="347.5" y="-665.5" font-family="Helvetica,sans-Serif" font-size="10.00">Network Node</text>
</g>
<!-- br_ex -->
<g id="node7" class="node"><title>br_ex</title>
<polygon fill="white" stroke="none" points="326.5,-456 326.5,-572 431.5,-572 431.5,-456 326.5,-456"/>
<polygon fill="white" stroke="none" points="332,-545 332,-567 427,-567 427,-545 332,-545"/>
<text text-anchor="start" x="355" y="-553.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_ex</text>
<polygon fill="#ff9933" stroke="none" points="332,-517 332,-540 427,-540 427,-517 332,-517"/>
<polygon fill="none" stroke="black" points="332,-517 332,-540 427,-540 427,-517 332,-517"/>
<text text-anchor="start" x="364" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">router1</text>
<polygon fill="#ff9933" stroke="none" points="332,-489 332,-512 427,-512 427,-489 332,-489"/>
<polygon fill="none" stroke="black" points="332,-489 332,-512 427,-512 427,-489 332,-489"/>
<text text-anchor="start" x="349.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">172.24.4.3/24</text>
<polygon fill="#ff9933" stroke="none" points="332,-461 332,-484 427,-484 427,-461 332,-461"/>
<polygon fill="none" stroke="black" points="332,-461 332,-484 427,-484 427,-461 332,-461"/>
<text text-anchor="start" x="338.5" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">[2] qg&#45;757bf552&#45;73</text>
</g>
<!-- NetworkNode&#45;&gt;br_ex -->
<!-- network_br_int -->
<g id="node8" class="node"><title>network_br_int</title>
<polygon fill="white" stroke="none" points="326.5,-176 326.5,-376 527.5,-376 527.5,-176 326.5,-176"/>
<polygon fill="white" stroke="none" points="332,-349 332,-371 523,-371 523,-349 332,-349"/>
<text text-anchor="start" x="403" y="-357.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_int</text>
<polygon fill="#c079f3" stroke="none" points="332,-321 332,-344 427,-344 427,-321 332,-321"/>
<polygon fill="none" stroke="black" points="332,-321 332,-344 427,-344 427,-321 332,-321"/>
<text text-anchor="start" x="338.5" y="-330" font-family="Helvetica,sans-Serif" font-size="10.00">[8] qr&#45;43b83157&#45;3b</text>
<polygon fill="#c079f3" stroke="none" points="432,-321 432,-344 523,-344 523,-321 432,-321"/>
<polygon fill="none" stroke="black" points="432,-321 432,-344 523,-344 523,-321 432,-321"/>
<text text-anchor="start" x="438" y="-330" font-family="Helvetica,sans-Serif" font-size="10.00">[5] tap59f90a3b&#45;f5</text>
<polygon fill="#c079f3" stroke="none" points="332,-293 332,-316 427,-316 427,-293 332,-293"/>
<polygon fill="none" stroke="black" points="332,-293 332,-316 427,-316 427,-293 332,-293"/>
<text text-anchor="start" x="353.5" y="-302" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="432,-293 432,-316 523,-316 523,-293 432,-293"/>
<polygon fill="none" stroke="black" points="432,-293 432,-316 523,-316 523,-293 432,-293"/>
<text text-anchor="start" x="451.5" y="-302" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="332,-265 332,-288 427,-288 427,-265 332,-265"/>
<polygon fill="none" stroke="black" points="332,-265 332,-288 427,-288 427,-265 332,-265"/>
<text text-anchor="start" x="352" y="-274" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.1/24</text>
<polygon fill="#c079f3" stroke="none" points="432,-265 432,-288 523,-288 523,-265 432,-265"/>
<polygon fill="none" stroke="black" points="432,-265 432,-288 523,-288 523,-265 432,-265"/>
<text text-anchor="start" x="450" y="-274" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.2/24</text>
<polygon fill="#c079f3" stroke="none" points="332,-237 332,-260 523,-260 523,-237 332,-237"/>
<polygon fill="none" stroke="black" points="332,-237 332,-260 523,-260 523,-237 332,-237"/>
<text text-anchor="start" x="410" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#ff9933" stroke="none" points="332,-209 332,-232 523,-232 523,-209 332,-209"/>
<polygon fill="none" stroke="black" points="332,-209 332,-232 523,-232 523,-209 332,-209"/>
<text text-anchor="start" x="412" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">router1</text>
<polygon fill="#ffcc00" stroke="none" points="332,-181 332,-204 523,-204 523,-181 332,-181"/>
<polygon fill="none" stroke="black" points="332,-181 332,-204 523,-204 523,-181 332,-181"/>
<text text-anchor="start" x="400" y="-190" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;tun</text>
</g>
<!-- br_ex&#45;&gt;network_br_int -->
<g id="edge7" class="edge"><title>br_ex:qg_757bf552_73:s&#45;&gt;network_br_int:qr_43b83157_3b:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M380,-460C380,-408.887 379,-396.113 379,-345"/>
</g>
<!-- network_br_tun -->
<g id="node9" class="node"><title>network_br_tun</title>
<polygon fill="white" stroke="none" points="388,-36 388,-96 468,-96 468,-36 388,-36"/>
<polygon fill="white" stroke="none" points="393,-69 393,-91 463,-91 463,-69 393,-69"/>
<text text-anchor="start" x="402" y="-77.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_tun</text>
<polygon fill="#ffcc00" stroke="none" points="393,-41 393,-64 463,-64 463,-41 393,-41"/>
<polygon fill="none" stroke="black" points="393,-41 393,-64 463,-64 463,-41 393,-41"/>
<text text-anchor="start" x="402" y="-50" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;int</text>
</g>
<!-- network_br_int&#45;&gt;network_br_tun -->
<g id="edge6" class="edge"><title>network_br_int:patch_tun:s&#45;&gt;network_br_tun:patch_int:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M428,-180C428,-128.889 428,-116.111 428,-65"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

View File

@ -0,0 +1,278 @@
digraph DON_DON {
graph [fontsize=10 fontname="Helvetica"];
node [fontsize=10 fontname="Helvetica"];
rankdir = TB;
ranksep = 1;
concentrate = true;
compound = true;
edge [dir=none]
subgraph cluster_DONComputeNode {
style=filled
subgraph cluster_ComputeNode {
ComputeNode [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="red">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="yellow" PORT="ComputeNode">Compute Node</TD>
</TR>
</TABLE>>];
}
subgraph cluster_Nova {
style=filled
subgraph cluster_VMs {
VMs [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="7" BORDER="0" BGCOLOR="white" PORT="VMs">VMs</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933">VM1-1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933">VM1-2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933">VM3-1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933">VM3-2</TD>
<TD ROWSPAN="1" COLSPAN="3" BGCOLOR="#ff9933">VM4</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3">private1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3">private1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379">private2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379">private2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379">private2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#79f3ef">public</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3">private1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="10023">10.0.2.3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="10024">10.0.2.4</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="10033">10.0.3.3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="10034">10.0.3.4</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="10036">10.0.3.6</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#79f3ef" PORT="1722445">172.24.4.5</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="10026">10.0.2.6</TD>
</TR>
</TABLE>>];
}
subgraph cluster_LinuxBridge {
LinuxBridge [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="7" BORDER="0" BGCOLOR="white" PORT="LinuxBridge">Linux Bridge</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tapba7460ea_c9">tapba7460ea-c9</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tapa1eba09e_99">tapa1eba09e-99</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="tap95772001_99">tap95772001-99</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="tapb0cb94f0_97">tapb0cb94f0-97</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="tap58b49f9d_1d">tap58b49f9d-1d</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#79f3ef" PORT="tap68484e46_cf">tap68484e46-cf</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tap8f35a39f_2a">tap8f35a39f-2a</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qbrba7460ea_c9">qbrba7460ea-c9</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qbra1eba09e_99">qbra1eba09e-99</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qbr95772001_99">qbr95772001-99</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qbrb0cb94f0_97">qbrb0cb94f0-97</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qbr58b49f9d_1d">qbr58b49f9d-1d</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#79f3ef" PORT="qbr68484e46_cf">qbr68484e46-cf</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qbr8f35a39f_2a">qbr8f35a39f-2a</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvbba7460ea_c9">qvbba7460ea-c9</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvba1eba09e_99">qvba1eba09e-99</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qvb95772001_99">qvb95772001-99</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qvbb0cb94f0_97">qvbb0cb94f0-97</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qvb58b49f9d_1d">qvb58b49f9d-1d</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#79f3ef" PORT="qvb68484e46_cf">qvb68484e46-cf</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvb8f35a39f_2a">qvb8f35a39f-2a</TD>
</TR>
</TABLE>>];
}
}
subgraph cluster_OVS {
style=filled
subgraph cluster_compute_br_int {
compute_br_int [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="7" BORDER="0" BGCOLOR="white" PORT="OVSbr_int">OVS br_int</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvoba7460ea_c9">[28] qvoba7460ea-c9</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvoa1eba09e_99">[29] qvoa1eba09e-99</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qvo95772001_99">[30] qvo95772001-99</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qvob0cb94f0_97">[31] qvob0cb94f0-97</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qvo58b49f9d_1d">[33] qvo58b49f9d-1d</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#79f3ef" PORT="qvo68484e46_cf">[34] qvo68484e46-cf</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvo8f35a39f_2a">[32] qvo8f35a39f-2a</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvoba7460ea_c9tag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvoa1eba09e_99tag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qvo95772001_99tag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qvob0cb94f0_97tag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qvo58b49f9d_1dtag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#79f3ef" PORT="qvo68484e46_cftag_4">VLAN tag:4</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvo8f35a39f_2atag_2">VLAN tag:2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="7" BGCOLOR="#ffcc00" PORT="patch_tun">[19] patch-tun</TD>
</TR>
</TABLE>>];
}
subgraph cluster_compute_br_tun {
compute_br_tun [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="7" BORDER="0" BGCOLOR="white" PORT="OVSbr_tun">OVS br_tun</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="7" BGCOLOR="#ffcc00" PORT="patch_int">[1] patch-int</TD>
</TR>
</TABLE>>];
}
}
ComputeNode:s -> VMs:n [color = "#0066cc", penwidth = "4", style="invis"]
VMs:10023:s -> LinuxBridge:tapba7460ea_c9:n [color = "#0066cc", penwidth = "4"]
VMs:10024:s -> LinuxBridge:tapa1eba09e_99:n [color = "#0066cc", penwidth = "4"]
VMs:10033:s -> LinuxBridge:tap95772001_99:n [color = "#0066cc", penwidth = "4"]
VMs:10034:s -> LinuxBridge:tapb0cb94f0_97:n [color = "#0066cc", penwidth = "4"]
VMs:10036:s -> LinuxBridge:tap58b49f9d_1d:n [color = "#0066cc", penwidth = "4"]
VMs:1722445:s -> LinuxBridge:tap68484e46_cf:n [color = "#0066cc", penwidth = "4"]
VMs:10026:s -> LinuxBridge:tap8f35a39f_2a:n [color = "#0066cc", penwidth = "4"]
LinuxBridge:qvbba7460ea_c9:s -> compute_br_int:qvoba7460ea_c9:n [color = "#0066cc", penwidth = "4"]
LinuxBridge:qvba1eba09e_99:s -> compute_br_int:qvoa1eba09e_99:n [color = "#0066cc", penwidth = "4"]
LinuxBridge:qvb95772001_99:s -> compute_br_int:qvo95772001_99:n [color = "#0066cc", penwidth = "4"]
LinuxBridge:qvbb0cb94f0_97:s -> compute_br_int:qvob0cb94f0_97:n [color = "#0066cc", penwidth = "4"]
LinuxBridge:qvb58b49f9d_1d:s -> compute_br_int:qvo58b49f9d_1d:n [color = "#0066cc", penwidth = "4"]
LinuxBridge:qvb68484e46_cf:s -> compute_br_int:qvo68484e46_cf:n [color = "#0066cc", penwidth = "4"]
LinuxBridge:qvb8f35a39f_2a:s -> compute_br_int:qvo8f35a39f_2a:n [color = "#0066cc", penwidth = "4"]
compute_br_int:patch_tun:s -> compute_br_tun:patch_int:n [color = "#0066cc", penwidth = "4"]
}
subgraph cluster_DONNetworkNode {
style=filled
subgraph cluster_NetworkNode {
NetworkNode [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="red">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="yellow" PORT="NetworkNode">Network Node</TD>
</TR>
</TABLE>>];
}
subgraph cluster_OVS {
style=filled
subgraph cluster_br_ex {
br_ex [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_ex">OVS br_ex</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="router1">router1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="router2">router2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="172.24.4.3/24">172.24.4.3/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="172.24.4.4/24">172.24.4.4/24</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="qg_e6c19c2c_8c">[6] qg-e6c19c2c-8c</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="qg_718e237a_3a">[7] qg-718e237a-3a</TD>
</TR>
</TABLE>>];
}
subgraph cluster_network_br_int {
network_br_int [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="8" BORDER="0" BGCOLOR="white" PORT="OVSbr_int">OVS br_int</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qr_04542d8f_13">[25] qr-04542d8f-13</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="tapfd625661_7e">[23] tapfd625661-7e</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_e503ba9c_89">[24] qr-e503ba9c-89</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tapb9083cd7_6f">[22] tapb9083cd7-6f</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qr_fb2585a7_bd">[27] qr-fb2585a7-bd</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="tapfd625661_7e">[23] tapfd625661-7e</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_5de9034a_db">[26] qr-5de9034a-db</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tapb9083cd7_6f">[22] tapb9083cd7-6f</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qr_04542d8f_13tag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="tapfd625661_7etag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_e503ba9c_89tag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tapb9083cd7_6ftag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qr_fb2585a7_bdtag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="tapfd625661_7etag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_5de9034a_dbtag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tapb9083cd7_6ftag_2">VLAN tag:2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qr_04542d8f_1310.0.3.1/24">10.0.3.1/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="tapfd625661_7e10.0.3.2/24">10.0.3.2/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_e503ba9c_8910.0.2.1/24">10.0.2.1/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tapb9083cd7_6f10.0.2.2/24">10.0.2.2/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qr_fb2585a7_bd10.0.3.5/24">10.0.3.5/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="tapfd625661_7e10.0.3.2/24">10.0.3.2/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_5de9034a_db10.0.2.5/24">10.0.2.5/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tapb9083cd7_6f10.0.2.2/24">10.0.2.2/24</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#b2f379" PORT="private2">private2</TD>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#c079f3" PORT="private1">private1</TD>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#b2f379" PORT="private2">private2</TD>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#c079f3" PORT="private1">private1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="4" BGCOLOR="#ff9933" PORT="router1">router1</TD>
<TD ROWSPAN="1" COLSPAN="4" BGCOLOR="#ff9933" PORT="router2">router2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="8" BGCOLOR="#ffcc00" PORT="patch_tun">[19] patch-tun</TD>
</TR>
</TABLE>>];
}
subgraph cluster_network_br_tun {
network_br_tun [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="7" BORDER="0" BGCOLOR="white" PORT="OVSbr_tun">OVS br_tun</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="7" BGCOLOR="#ffcc00" PORT="patch_int">[1] patch-int</TD>
</TR>
</TABLE>>];
}
}
NetworkNode:s -> br_ex:n [color = "#0066cc", penwidth = "4", style="invis"]
network_br_int:patch_tun:s -> network_br_tun:patch_int:n [color = "#0066cc", penwidth = "4"]
br_ex:qg_e6c19c2c_8c:s -> network_br_int:qr_04542d8f_13:n [color = "#0066cc", penwidth = "4"]
br_ex:qg_e6c19c2c_8c:s -> network_br_int:qr_e503ba9c_89:n [color = "#0066cc", penwidth = "4"]
br_ex:qg_718e237a_3a:s -> network_br_int:qr_fb2585a7_bd:n [color = "#0066cc", penwidth = "4"]
br_ex:qg_718e237a_3a:s -> network_br_int:qr_5de9034a_db:n [color = "#0066cc", penwidth = "4"]
}
}

View File

@ -0,0 +1,473 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.36.0 (20140111.2315)
-->
<!-- Title: DON_DON Pages: 1 -->
<svg width="1746pt" height="916pt"
viewBox="0.00 0.00 1746.00 916.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 912)">
<title>DON_DON</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-912 1742,-912 1742,4 -4,4"/>
<g id="clust1" class="cluster"><title>cluster_DONComputeNode</title>
<polygon fill="lightgrey" stroke="black" points="8,-8 8,-900 824,-900 824,-8 8,-8"/>
</g>
<g id="clust2" class="cluster"><title>cluster_ComputeNode</title>
<polygon fill="lightgrey" stroke="black" points="365,-836 365,-892 485,-892 485,-836 365,-836"/>
</g>
<g id="clust3" class="cluster"><title>cluster_Nova</title>
<polygon fill="lightgrey" stroke="black" points="83,-394 83,-788 749,-788 749,-394 83,-394"/>
</g>
<g id="clust4" class="cluster"><title>cluster_VMs</title>
<polygon fill="lightgrey" stroke="black" points="215,-640 215,-780 635,-780 635,-640 215,-640"/>
</g>
<g id="clust5" class="cluster"><title>cluster_LinuxBridge</title>
<polygon fill="lightgrey" stroke="black" points="91,-402 91,-542 741,-542 741,-402 91,-402"/>
</g>
<g id="clust6" class="cluster"><title>cluster_OVS</title>
<polygon fill="lightgrey" stroke="black" points="16,-16 16,-312 816,-312 816,-16 16,-16"/>
</g>
<g id="clust7" class="cluster"><title>cluster_compute_br_int</title>
<polygon fill="lightgrey" stroke="black" points="24,-164 24,-304 808,-304 808,-164 24,-164"/>
</g>
<g id="clust8" class="cluster"><title>cluster_compute_br_tun</title>
<polygon fill="lightgrey" stroke="black" points="346,-24 346,-108 484,-108 484,-24 346,-24"/>
</g>
<g id="clust9" class="cluster"><title>cluster_DONNetworkNode</title>
<polygon fill="lightgrey" stroke="black" points="832,-176 832,-900 1730,-900 1730,-176 832,-176"/>
</g>
<g id="clust11" class="cluster"><title>cluster_OVS</title>
<polygon fill="lightgrey" stroke="black" points="840,-184 840,-788 1722,-788 1722,-184 840,-184"/>
</g>
<g id="clust12" class="cluster"><title>cluster_br_ex</title>
<polygon fill="lightgrey" stroke="black" points="1109,-640 1109,-780 1349,-780 1349,-640 1109,-640"/>
</g>
<g id="clust13" class="cluster"><title>cluster_network_br_int</title>
<polygon fill="lightgrey" stroke="black" points="848,-360 848,-584 1714,-584 1714,-360 848,-360"/>
</g>
<g id="clust14" class="cluster"><title>cluster_network_br_tun</title>
<polygon fill="lightgrey" stroke="black" points="1211,-192 1211,-276 1349,-276 1349,-192 1211,-192"/>
</g>
<g id="clust10" class="cluster"><title>cluster_NetworkNode</title>
<polygon fill="lightgrey" stroke="black" points="1170,-836 1170,-892 1288,-892 1288,-836 1170,-836"/>
</g>
<!-- ComputeNode -->
<g id="node1" class="node"><title>ComputeNode</title>
<polygon fill="red" stroke="none" points="381,-848 381,-880 469,-880 469,-848 381,-848"/>
<polygon fill="yellow" stroke="none" points="386,-853 386,-875 464,-875 464,-853 386,-853"/>
<text text-anchor="start" x="391.5" y="-861.5" font-family="Helvetica,sans-Serif" font-size="10.00">Compute Node</text>
</g>
<!-- VMs -->
<g id="node2" class="node"><title>VMs</title>
<polygon fill="white" stroke="none" points="231.5,-652 231.5,-768 618.5,-768 618.5,-652 231.5,-652"/>
<polygon fill="white" stroke="none" points="237,-741 237,-763 614,-763 614,-741 237,-741"/>
<text text-anchor="start" x="415" y="-749.5" font-family="Helvetica,sans-Serif" font-size="10.00">VMs</text>
<polygon fill="#ff9933" stroke="none" points="237,-713 237,-736 286,-736 286,-713 237,-713"/>
<polygon fill="none" stroke="black" points="237,-713 237,-736 286,-736 286,-713 237,-713"/>
<text text-anchor="start" x="247" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">VM1&#45;1</text>
<polygon fill="#ff9933" stroke="none" points="291,-713 291,-736 339,-736 339,-713 291,-713"/>
<polygon fill="none" stroke="black" points="291,-713 291,-736 339,-736 339,-713 291,-713"/>
<text text-anchor="start" x="300.5" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">VM1&#45;2</text>
<polygon fill="#ff9933" stroke="none" points="344,-713 344,-736 392,-736 392,-713 344,-713"/>
<polygon fill="none" stroke="black" points="344,-713 344,-736 392,-736 392,-713 344,-713"/>
<text text-anchor="start" x="353.5" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">VM3&#45;1</text>
<polygon fill="#ff9933" stroke="none" points="397,-713 397,-736 445,-736 445,-713 397,-713"/>
<polygon fill="none" stroke="black" points="397,-713 397,-736 445,-736 445,-713 397,-713"/>
<text text-anchor="start" x="406.5" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">VM3&#45;2</text>
<polygon fill="#ff9933" stroke="none" points="450,-713 450,-736 614,-736 614,-713 450,-713"/>
<polygon fill="none" stroke="black" points="450,-713 450,-736 614,-736 614,-713 450,-713"/>
<text text-anchor="start" x="521.5" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">VM4</text>
<polygon fill="#c079f3" stroke="none" points="237,-685 237,-708 286,-708 286,-685 237,-685"/>
<polygon fill="none" stroke="black" points="237,-685 237,-708 286,-708 286,-685 237,-685"/>
<text text-anchor="start" x="244" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#c079f3" stroke="none" points="291,-685 291,-708 339,-708 339,-685 291,-685"/>
<polygon fill="none" stroke="black" points="291,-685 291,-708 339,-708 339,-685 291,-685"/>
<text text-anchor="start" x="297.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#b2f379" stroke="none" points="344,-685 344,-708 392,-708 392,-685 344,-685"/>
<polygon fill="none" stroke="black" points="344,-685 344,-708 392,-708 392,-685 344,-685"/>
<text text-anchor="start" x="350.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private2</text>
<polygon fill="#b2f379" stroke="none" points="397,-685 397,-708 445,-708 445,-685 397,-685"/>
<polygon fill="none" stroke="black" points="397,-685 397,-708 445,-708 445,-685 397,-685"/>
<text text-anchor="start" x="403.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private2</text>
<polygon fill="#b2f379" stroke="none" points="450,-685 450,-708 498,-708 498,-685 450,-685"/>
<polygon fill="none" stroke="black" points="450,-685 450,-708 498,-708 498,-685 450,-685"/>
<text text-anchor="start" x="456.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private2</text>
<polygon fill="#79f3ef" stroke="none" points="503,-685 503,-708 561,-708 561,-685 503,-685"/>
<polygon fill="none" stroke="black" points="503,-685 503,-708 561,-708 561,-685 503,-685"/>
<text text-anchor="start" x="519" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">public</text>
<polygon fill="#c079f3" stroke="none" points="566,-685 566,-708 614,-708 614,-685 566,-685"/>
<polygon fill="none" stroke="black" points="566,-685 566,-708 614,-708 614,-685 566,-685"/>
<text text-anchor="start" x="572.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#c079f3" stroke="none" points="237,-657 237,-680 286,-680 286,-657 237,-657"/>
<polygon fill="none" stroke="black" points="237,-657 237,-680 286,-680 286,-657 237,-657"/>
<text text-anchor="start" x="243.5" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.3</text>
<polygon fill="#c079f3" stroke="none" points="291,-657 291,-680 339,-680 339,-657 291,-657"/>
<polygon fill="none" stroke="black" points="291,-657 291,-680 339,-680 339,-657 291,-657"/>
<text text-anchor="start" x="297" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.4</text>
<polygon fill="#b2f379" stroke="none" points="344,-657 344,-680 392,-680 392,-657 344,-657"/>
<polygon fill="none" stroke="black" points="344,-657 344,-680 392,-680 392,-657 344,-657"/>
<text text-anchor="start" x="350" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.3</text>
<polygon fill="#b2f379" stroke="none" points="397,-657 397,-680 445,-680 445,-657 397,-657"/>
<polygon fill="none" stroke="black" points="397,-657 397,-680 445,-680 445,-657 397,-657"/>
<text text-anchor="start" x="403" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.4</text>
<polygon fill="#b2f379" stroke="none" points="450,-657 450,-680 498,-680 498,-657 450,-657"/>
<polygon fill="none" stroke="black" points="450,-657 450,-680 498,-680 498,-657 450,-657"/>
<text text-anchor="start" x="456" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.6</text>
<polygon fill="#79f3ef" stroke="none" points="503,-657 503,-680 561,-680 561,-657 503,-657"/>
<polygon fill="none" stroke="black" points="503,-657 503,-680 561,-680 561,-657 503,-657"/>
<text text-anchor="start" x="509" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">172.24.4.5</text>
<polygon fill="#c079f3" stroke="none" points="566,-657 566,-680 614,-680 614,-657 566,-657"/>
<polygon fill="none" stroke="black" points="566,-657 566,-680 614,-680 614,-657 566,-657"/>
<text text-anchor="start" x="572" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.6</text>
</g>
<!-- ComputeNode&#45;&gt;VMs -->
<!-- LinuxBridge -->
<g id="node3" class="node"><title>LinuxBridge</title>
<polygon fill="white" stroke="none" points="107,-414 107,-530 725,-530 725,-414 107,-414"/>
<polygon fill="white" stroke="none" points="112,-503 112,-525 720,-525 720,-503 112,-503"/>
<text text-anchor="start" x="388.5" y="-511.5" font-family="Helvetica,sans-Serif" font-size="10.00">Linux Bridge</text>
<polygon fill="#c079f3" stroke="none" points="112,-475 112,-498 197,-498 197,-475 112,-475"/>
<polygon fill="none" stroke="black" points="112,-475 112,-498 197,-498 197,-475 112,-475"/>
<text text-anchor="start" x="119.5" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tapba7460ea&#45;c9</text>
<polygon fill="#c079f3" stroke="none" points="202,-475 202,-498 286,-498 286,-475 202,-475"/>
<polygon fill="none" stroke="black" points="202,-475 202,-498 286,-498 286,-475 202,-475"/>
<text text-anchor="start" x="209" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tapa1eba09e&#45;99</text>
<polygon fill="#b2f379" stroke="none" points="291,-475 291,-498 375,-498 375,-475 291,-475"/>
<polygon fill="none" stroke="black" points="291,-475 291,-498 375,-498 375,-475 291,-475"/>
<text text-anchor="start" x="298" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tap95772001&#45;99</text>
<polygon fill="#b2f379" stroke="none" points="380,-475 380,-498 462,-498 462,-475 380,-475"/>
<polygon fill="none" stroke="black" points="380,-475 380,-498 462,-498 462,-475 380,-475"/>
<text text-anchor="start" x="387.5" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tapb0cb94f0&#45;97</text>
<polygon fill="#b2f379" stroke="none" points="467,-475 467,-498 549,-498 549,-475 467,-475"/>
<polygon fill="none" stroke="black" points="467,-475 467,-498 549,-498 549,-475 467,-475"/>
<text text-anchor="start" x="474.5" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tap58b49f9d&#45;1d</text>
<polygon fill="#79f3ef" stroke="none" points="554,-475 554,-498 636,-498 636,-475 554,-475"/>
<polygon fill="none" stroke="black" points="554,-475 554,-498 636,-498 636,-475 554,-475"/>
<text text-anchor="start" x="561.5" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tap68484e46&#45;cf</text>
<polygon fill="#c079f3" stroke="none" points="641,-475 641,-498 720,-498 720,-475 641,-475"/>
<polygon fill="none" stroke="black" points="641,-475 641,-498 720,-498 720,-475 641,-475"/>
<text text-anchor="start" x="648" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tap8f35a39f&#45;2a</text>
<polygon fill="#c079f3" stroke="none" points="112,-447 112,-470 197,-470 197,-447 112,-447"/>
<polygon fill="none" stroke="black" points="112,-447 112,-470 197,-470 197,-447 112,-447"/>
<text text-anchor="start" x="119.5" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbrba7460ea&#45;c9</text>
<polygon fill="#c079f3" stroke="none" points="202,-447 202,-470 286,-470 286,-447 202,-447"/>
<polygon fill="none" stroke="black" points="202,-447 202,-470 286,-470 286,-447 202,-447"/>
<text text-anchor="start" x="209" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbra1eba09e&#45;99</text>
<polygon fill="#b2f379" stroke="none" points="291,-447 291,-470 375,-470 375,-447 291,-447"/>
<polygon fill="none" stroke="black" points="291,-447 291,-470 375,-470 375,-447 291,-447"/>
<text text-anchor="start" x="298" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbr95772001&#45;99</text>
<polygon fill="#b2f379" stroke="none" points="380,-447 380,-470 462,-470 462,-447 380,-447"/>
<polygon fill="none" stroke="black" points="380,-447 380,-470 462,-470 462,-447 380,-447"/>
<text text-anchor="start" x="387.5" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbrb0cb94f0&#45;97</text>
<polygon fill="#b2f379" stroke="none" points="467,-447 467,-470 549,-470 549,-447 467,-447"/>
<polygon fill="none" stroke="black" points="467,-447 467,-470 549,-470 549,-447 467,-447"/>
<text text-anchor="start" x="474.5" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbr58b49f9d&#45;1d</text>
<polygon fill="#79f3ef" stroke="none" points="554,-447 554,-470 636,-470 636,-447 554,-447"/>
<polygon fill="none" stroke="black" points="554,-447 554,-470 636,-470 636,-447 554,-447"/>
<text text-anchor="start" x="561.5" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbr68484e46&#45;cf</text>
<polygon fill="#c079f3" stroke="none" points="641,-447 641,-470 720,-470 720,-447 641,-447"/>
<polygon fill="none" stroke="black" points="641,-447 641,-470 720,-470 720,-447 641,-447"/>
<text text-anchor="start" x="648" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbr8f35a39f&#45;2a</text>
<polygon fill="#c079f3" stroke="none" points="112,-419 112,-442 197,-442 197,-419 112,-419"/>
<polygon fill="none" stroke="black" points="112,-419 112,-442 197,-442 197,-419 112,-419"/>
<text text-anchor="start" x="118.5" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvbba7460ea&#45;c9</text>
<polygon fill="#c079f3" stroke="none" points="202,-419 202,-442 286,-442 286,-419 202,-419"/>
<polygon fill="none" stroke="black" points="202,-419 202,-442 286,-442 286,-419 202,-419"/>
<text text-anchor="start" x="208" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvba1eba09e&#45;99</text>
<polygon fill="#b2f379" stroke="none" points="291,-419 291,-442 375,-442 375,-419 291,-419"/>
<polygon fill="none" stroke="black" points="291,-419 291,-442 375,-442 375,-419 291,-419"/>
<text text-anchor="start" x="297" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvb95772001&#45;99</text>
<polygon fill="#b2f379" stroke="none" points="380,-419 380,-442 462,-442 462,-419 380,-419"/>
<polygon fill="none" stroke="black" points="380,-419 380,-442 462,-442 462,-419 380,-419"/>
<text text-anchor="start" x="386" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvbb0cb94f0&#45;97</text>
<polygon fill="#b2f379" stroke="none" points="467,-419 467,-442 549,-442 549,-419 467,-419"/>
<polygon fill="none" stroke="black" points="467,-419 467,-442 549,-442 549,-419 467,-419"/>
<text text-anchor="start" x="473" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvb58b49f9d&#45;1d</text>
<polygon fill="#79f3ef" stroke="none" points="554,-419 554,-442 636,-442 636,-419 554,-419"/>
<polygon fill="none" stroke="black" points="554,-419 554,-442 636,-442 636,-419 554,-419"/>
<text text-anchor="start" x="560" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvb68484e46&#45;cf</text>
<polygon fill="#c079f3" stroke="none" points="641,-419 641,-442 720,-442 720,-419 641,-419"/>
<polygon fill="none" stroke="black" points="641,-419 641,-442 720,-442 720,-419 641,-419"/>
<text text-anchor="start" x="647" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvb8f35a39f&#45;2a</text>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge2" class="edge"><title>VMs:10023:s&#45;&gt;LinuxBridge:tapba7460ea_c9:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M261,-656C261,-571.558 154,-583.442 154,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge3" class="edge"><title>VMs:10024:s&#45;&gt;LinuxBridge:tapa1eba09e_99:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M315,-656C315,-579.419 244,-575.581 244,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge4" class="edge"><title>VMs:10033:s&#45;&gt;LinuxBridge:tap95772001_99:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M368,-656C368,-584.509 333,-570.491 333,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge5" class="edge"><title>VMs:10034:s&#45;&gt;LinuxBridge:tapb0cb94f0_97:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M421,-656C421,-586.222 421,-568.778 421,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge6" class="edge"><title>VMs:10036:s&#45;&gt;LinuxBridge:tap58b49f9d_1d:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M474,-656C474,-584.605 508,-570.395 508,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge7" class="edge"><title>VMs:1722445:s&#45;&gt;LinuxBridge:tap68484e46_cf:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M532,-656C532,-580.814 595,-574.186 595,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge8" class="edge"><title>VMs:10026:s&#45;&gt;LinuxBridge:tap8f35a39f_2a:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M590,-656C590,-575.348 681,-579.652 681,-499"/>
</g>
<!-- compute_br_int -->
<g id="node4" class="node"><title>compute_br_int</title>
<polygon fill="white" stroke="none" points="40,-176 40,-292 792,-292 792,-176 40,-176"/>
<polygon fill="white" stroke="none" points="45,-265 45,-287 787,-287 787,-265 45,-265"/>
<text text-anchor="start" x="391.5" y="-273.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_int</text>
<polygon fill="#c079f3" stroke="none" points="45,-237 45,-260 149,-260 149,-237 45,-237"/>
<polygon fill="none" stroke="black" points="45,-237 45,-260 149,-260 149,-237 45,-237"/>
<text text-anchor="start" x="51.5" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[28] qvoba7460ea&#45;c9</text>
<polygon fill="#c079f3" stroke="none" points="154,-237 154,-260 257,-260 257,-237 154,-237"/>
<polygon fill="none" stroke="black" points="154,-237 154,-260 257,-260 257,-237 154,-237"/>
<text text-anchor="start" x="160" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[29] qvoa1eba09e&#45;99</text>
<polygon fill="#b2f379" stroke="none" points="262,-237 262,-260 365,-260 365,-237 262,-237"/>
<polygon fill="none" stroke="black" points="262,-237 262,-260 365,-260 365,-237 262,-237"/>
<text text-anchor="start" x="268" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[30] qvo95772001&#45;99</text>
<polygon fill="#b2f379" stroke="none" points="370,-237 370,-260 471,-260 471,-237 370,-237"/>
<polygon fill="none" stroke="black" points="370,-237 370,-260 471,-260 471,-237 370,-237"/>
<text text-anchor="start" x="376" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[31] qvob0cb94f0&#45;97</text>
<polygon fill="#b2f379" stroke="none" points="476,-237 476,-260 577,-260 577,-237 476,-237"/>
<polygon fill="none" stroke="black" points="476,-237 476,-260 577,-260 577,-237 476,-237"/>
<text text-anchor="start" x="482" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[33] qvo58b49f9d&#45;1d</text>
<polygon fill="#79f3ef" stroke="none" points="582,-237 582,-260 683,-260 683,-237 582,-237"/>
<polygon fill="none" stroke="black" points="582,-237 582,-260 683,-260 683,-237 582,-237"/>
<text text-anchor="start" x="588" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[34] qvo68484e46&#45;cf</text>
<polygon fill="#c079f3" stroke="none" points="688,-237 688,-260 787,-260 787,-237 688,-237"/>
<polygon fill="none" stroke="black" points="688,-237 688,-260 787,-260 787,-237 688,-237"/>
<text text-anchor="start" x="694" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[32] qvo8f35a39f&#45;2a</text>
<polygon fill="#c079f3" stroke="none" points="45,-209 45,-232 149,-232 149,-209 45,-209"/>
<polygon fill="none" stroke="black" points="45,-209 45,-232 149,-232 149,-209 45,-209"/>
<text text-anchor="start" x="71" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="154,-209 154,-232 257,-232 257,-209 154,-209"/>
<polygon fill="none" stroke="black" points="154,-209 154,-232 257,-232 257,-209 154,-209"/>
<text text-anchor="start" x="179.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#b2f379" stroke="none" points="262,-209 262,-232 365,-232 365,-209 262,-209"/>
<polygon fill="none" stroke="black" points="262,-209 262,-232 365,-232 365,-209 262,-209"/>
<text text-anchor="start" x="287.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#b2f379" stroke="none" points="370,-209 370,-232 471,-232 471,-209 370,-209"/>
<polygon fill="none" stroke="black" points="370,-209 370,-232 471,-232 471,-209 370,-209"/>
<text text-anchor="start" x="394.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#b2f379" stroke="none" points="476,-209 476,-232 577,-232 577,-209 476,-209"/>
<polygon fill="none" stroke="black" points="476,-209 476,-232 577,-232 577,-209 476,-209"/>
<text text-anchor="start" x="500.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#79f3ef" stroke="none" points="582,-209 582,-232 683,-232 683,-209 582,-209"/>
<polygon fill="none" stroke="black" points="582,-209 582,-232 683,-232 683,-209 582,-209"/>
<text text-anchor="start" x="606.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:4</text>
<polygon fill="#c079f3" stroke="none" points="688,-209 688,-232 787,-232 787,-209 688,-209"/>
<polygon fill="none" stroke="black" points="688,-209 688,-232 787,-232 787,-209 688,-209"/>
<text text-anchor="start" x="711.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#ffcc00" stroke="none" points="45,-181 45,-204 787,-204 787,-181 45,-181"/>
<polygon fill="none" stroke="black" points="45,-181 45,-204 787,-204 787,-181 45,-181"/>
<text text-anchor="start" x="385.5" y="-190" font-family="Helvetica,sans-Serif" font-size="10.00">[19] patch&#45;tun</text>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge9" class="edge"><title>LinuxBridge:qvbba7460ea_c9:s&#45;&gt;compute_br_int:qvoba7460ea_c9:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M154,-418C154,-343.766 97,-335.234 97,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge10" class="edge"><title>LinuxBridge:qvba1eba09e_99:s&#45;&gt;compute_br_int:qvoa1eba09e_99:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M244,-418C244,-346.102 205,-332.898 205,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge11" class="edge"><title>LinuxBridge:qvb95772001_99:s&#45;&gt;compute_br_int:qvo95772001_99:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M333,-418C333,-347.658 313,-331.342 313,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge12" class="edge"><title>LinuxBridge:qvbb0cb94f0_97:s&#45;&gt;compute_br_int:qvob0cb94f0_97:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M421,-418C421,-348.222 421,-330.778 421,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge13" class="edge"><title>LinuxBridge:qvb58b49f9d_1d:s&#45;&gt;compute_br_int:qvo58b49f9d_1d:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M508,-418C508,-347.713 527,-331.287 527,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge14" class="edge"><title>LinuxBridge:qvb68484e46_cf:s&#45;&gt;compute_br_int:qvo68484e46_cf:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M595,-418C595,-346.207 633,-332.793 633,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge15" class="edge"><title>LinuxBridge:qvb8f35a39f_2a:s&#45;&gt;compute_br_int:qvo8f35a39f_2a:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M681,-418C681,-343.766 738,-335.234 738,-261"/>
</g>
<!-- compute_br_tun -->
<g id="node5" class="node"><title>compute_br_tun</title>
<polygon fill="white" stroke="none" points="362.5,-36 362.5,-96 467.5,-96 467.5,-36 362.5,-36"/>
<polygon fill="white" stroke="none" points="368,-69 368,-91 463,-91 463,-69 368,-69"/>
<text text-anchor="start" x="389.5" y="-77.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_tun</text>
<polygon fill="#ffcc00" stroke="none" points="368,-41 368,-64 463,-64 463,-41 368,-41"/>
<polygon fill="none" stroke="black" points="368,-41 368,-64 463,-64 463,-41 368,-41"/>
<text text-anchor="start" x="389.5" y="-50" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;int</text>
</g>
<!-- compute_br_int&#45;&gt;compute_br_tun -->
<g id="edge16" class="edge"><title>compute_br_int:patch_tun:s&#45;&gt;compute_br_tun:patch_int:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M416,-180C416,-128.889 416,-116.111 416,-65"/>
</g>
<!-- NetworkNode -->
<g id="node6" class="node"><title>NetworkNode</title>
<polygon fill="red" stroke="none" points="1186.5,-848 1186.5,-880 1271.5,-880 1271.5,-848 1186.5,-848"/>
<polygon fill="yellow" stroke="none" points="1192,-853 1192,-875 1267,-875 1267,-853 1192,-853"/>
<text text-anchor="start" x="1197.5" y="-861.5" font-family="Helvetica,sans-Serif" font-size="10.00">Network Node</text>
</g>
<!-- br_ex -->
<g id="node7" class="node"><title>br_ex</title>
<polygon fill="white" stroke="none" points="1125,-652 1125,-768 1333,-768 1333,-652 1125,-652"/>
<polygon fill="white" stroke="none" points="1130,-741 1130,-763 1328,-763 1328,-741 1130,-741"/>
<text text-anchor="start" x="1204.5" y="-749.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_ex</text>
<polygon fill="#ff9933" stroke="none" points="1130,-713 1130,-736 1227,-736 1227,-713 1130,-713"/>
<polygon fill="none" stroke="black" points="1130,-713 1130,-736 1227,-736 1227,-713 1130,-713"/>
<text text-anchor="start" x="1163" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">router1</text>
<polygon fill="#ff9933" stroke="none" points="1232,-713 1232,-736 1328,-736 1328,-713 1232,-713"/>
<polygon fill="none" stroke="black" points="1232,-713 1232,-736 1328,-736 1328,-713 1232,-713"/>
<text text-anchor="start" x="1264.5" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">router2</text>
<polygon fill="#ff9933" stroke="none" points="1130,-685 1130,-708 1227,-708 1227,-685 1130,-685"/>
<polygon fill="none" stroke="black" points="1130,-685 1130,-708 1227,-708 1227,-685 1130,-685"/>
<text text-anchor="start" x="1148.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">172.24.4.3/24</text>
<polygon fill="#ff9933" stroke="none" points="1232,-685 1232,-708 1328,-708 1328,-685 1232,-685"/>
<polygon fill="none" stroke="black" points="1232,-685 1232,-708 1328,-708 1328,-685 1232,-685"/>
<text text-anchor="start" x="1250" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">172.24.4.4/24</text>
<polygon fill="#ff9933" stroke="none" points="1130,-657 1130,-680 1227,-680 1227,-657 1130,-657"/>
<polygon fill="none" stroke="black" points="1130,-657 1130,-680 1227,-680 1227,-657 1130,-657"/>
<text text-anchor="start" x="1136.5" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">[6] qg&#45;e6c19c2c&#45;8c</text>
<polygon fill="#ff9933" stroke="none" points="1232,-657 1232,-680 1328,-680 1328,-657 1232,-657"/>
<polygon fill="none" stroke="black" points="1232,-657 1232,-680 1328,-680 1328,-657 1232,-657"/>
<text text-anchor="start" x="1238" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">[7] qg&#45;718e237a&#45;3a</text>
</g>
<!-- NetworkNode&#45;&gt;br_ex -->
<!-- network_br_int -->
<g id="node8" class="node"><title>network_br_int</title>
<polygon fill="white" stroke="none" points="864,-372 864,-572 1698,-572 1698,-372 864,-372"/>
<polygon fill="white" stroke="none" points="869,-545 869,-567 1693,-567 1693,-545 869,-545"/>
<text text-anchor="start" x="1256.5" y="-553.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_int</text>
<polygon fill="#b2f379" stroke="none" points="869,-517 869,-540 967,-540 967,-517 869,-517"/>
<polygon fill="none" stroke="black" points="869,-517 869,-540 967,-540 967,-517 869,-517"/>
<text text-anchor="start" x="875.5" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[25] qr&#45;04542d8f&#45;13</text>
<polygon fill="#b2f379" stroke="none" points="972,-517 972,-540 1071,-540 1071,-517 972,-517"/>
<polygon fill="none" stroke="black" points="972,-517 972,-540 1071,-540 1071,-517 972,-517"/>
<text text-anchor="start" x="978" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[23] tapfd625661&#45;7e</text>
<polygon fill="#c079f3" stroke="none" points="1076,-517 1076,-540 1175,-540 1175,-517 1076,-517"/>
<polygon fill="none" stroke="black" points="1076,-517 1076,-540 1175,-540 1175,-517 1076,-517"/>
<text text-anchor="start" x="1082" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[24] qr&#45;e503ba9c&#45;89</text>
<polygon fill="#c079f3" stroke="none" points="1180,-517 1180,-540 1279,-540 1279,-517 1180,-517"/>
<polygon fill="none" stroke="black" points="1180,-517 1180,-540 1279,-540 1279,-517 1180,-517"/>
<text text-anchor="start" x="1186" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[22] tapb9083cd7&#45;6f</text>
<polygon fill="#b2f379" stroke="none" points="1284,-517 1284,-540 1381,-540 1381,-517 1284,-517"/>
<polygon fill="none" stroke="black" points="1284,-517 1284,-540 1381,-540 1381,-517 1284,-517"/>
<text text-anchor="start" x="1290" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[27] qr&#45;fb2585a7&#45;bd</text>
<polygon fill="#b2f379" stroke="none" points="1386,-517 1386,-540 1485,-540 1485,-517 1386,-517"/>
<polygon fill="none" stroke="black" points="1386,-517 1386,-540 1485,-540 1485,-517 1386,-517"/>
<text text-anchor="start" x="1392" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[23] tapfd625661&#45;7e</text>
<polygon fill="#c079f3" stroke="none" points="1490,-517 1490,-540 1589,-540 1589,-517 1490,-517"/>
<polygon fill="none" stroke="black" points="1490,-517 1490,-540 1589,-540 1589,-517 1490,-517"/>
<text text-anchor="start" x="1496" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[26] qr&#45;5de9034a&#45;db</text>
<polygon fill="#c079f3" stroke="none" points="1594,-517 1594,-540 1693,-540 1693,-517 1594,-517"/>
<polygon fill="none" stroke="black" points="1594,-517 1594,-540 1693,-540 1693,-517 1594,-517"/>
<text text-anchor="start" x="1600" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[22] tapb9083cd7&#45;6f</text>
<polygon fill="#b2f379" stroke="none" points="869,-489 869,-512 967,-512 967,-489 869,-489"/>
<polygon fill="none" stroke="black" points="869,-489 869,-512 967,-512 967,-489 869,-489"/>
<text text-anchor="start" x="892" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#b2f379" stroke="none" points="972,-489 972,-512 1071,-512 1071,-489 972,-489"/>
<polygon fill="none" stroke="black" points="972,-489 972,-512 1071,-512 1071,-489 972,-489"/>
<text text-anchor="start" x="995.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#c079f3" stroke="none" points="1076,-489 1076,-512 1175,-512 1175,-489 1076,-489"/>
<polygon fill="none" stroke="black" points="1076,-489 1076,-512 1175,-512 1175,-489 1076,-489"/>
<text text-anchor="start" x="1099.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="1180,-489 1180,-512 1279,-512 1279,-489 1180,-489"/>
<polygon fill="none" stroke="black" points="1180,-489 1180,-512 1279,-512 1279,-489 1180,-489"/>
<text text-anchor="start" x="1203.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#b2f379" stroke="none" points="1284,-489 1284,-512 1381,-512 1381,-489 1284,-489"/>
<polygon fill="none" stroke="black" points="1284,-489 1284,-512 1381,-512 1381,-489 1284,-489"/>
<text text-anchor="start" x="1306.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#b2f379" stroke="none" points="1386,-489 1386,-512 1485,-512 1485,-489 1386,-489"/>
<polygon fill="none" stroke="black" points="1386,-489 1386,-512 1485,-512 1485,-489 1386,-489"/>
<text text-anchor="start" x="1409.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#c079f3" stroke="none" points="1490,-489 1490,-512 1589,-512 1589,-489 1490,-489"/>
<polygon fill="none" stroke="black" points="1490,-489 1490,-512 1589,-512 1589,-489 1490,-489"/>
<text text-anchor="start" x="1513.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="1594,-489 1594,-512 1693,-512 1693,-489 1594,-489"/>
<polygon fill="none" stroke="black" points="1594,-489 1594,-512 1693,-512 1693,-489 1594,-489"/>
<text text-anchor="start" x="1617.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#b2f379" stroke="none" points="869,-461 869,-484 967,-484 967,-461 869,-461"/>
<polygon fill="none" stroke="black" points="869,-461 869,-484 967,-484 967,-461 869,-461"/>
<text text-anchor="start" x="893.5" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.1/24</text>
<polygon fill="#b2f379" stroke="none" points="972,-461 972,-484 1071,-484 1071,-461 972,-461"/>
<polygon fill="none" stroke="black" points="972,-461 972,-484 1071,-484 1071,-461 972,-461"/>
<text text-anchor="start" x="997" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.2/24</text>
<polygon fill="#c079f3" stroke="none" points="1076,-461 1076,-484 1175,-484 1175,-461 1076,-461"/>
<polygon fill="none" stroke="black" points="1076,-461 1076,-484 1175,-484 1175,-461 1076,-461"/>
<text text-anchor="start" x="1101" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.1/24</text>
<polygon fill="#c079f3" stroke="none" points="1180,-461 1180,-484 1279,-484 1279,-461 1180,-461"/>
<polygon fill="none" stroke="black" points="1180,-461 1180,-484 1279,-484 1279,-461 1180,-461"/>
<text text-anchor="start" x="1205" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.2/24</text>
<polygon fill="#b2f379" stroke="none" points="1284,-461 1284,-484 1381,-484 1381,-461 1284,-461"/>
<polygon fill="none" stroke="black" points="1284,-461 1284,-484 1381,-484 1381,-461 1284,-461"/>
<text text-anchor="start" x="1308" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.5/24</text>
<polygon fill="#b2f379" stroke="none" points="1386,-461 1386,-484 1485,-484 1485,-461 1386,-461"/>
<polygon fill="none" stroke="black" points="1386,-461 1386,-484 1485,-484 1485,-461 1386,-461"/>
<text text-anchor="start" x="1411" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.2/24</text>
<polygon fill="#c079f3" stroke="none" points="1490,-461 1490,-484 1589,-484 1589,-461 1490,-461"/>
<polygon fill="none" stroke="black" points="1490,-461 1490,-484 1589,-484 1589,-461 1490,-461"/>
<text text-anchor="start" x="1515" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.5/24</text>
<polygon fill="#c079f3" stroke="none" points="1594,-461 1594,-484 1693,-484 1693,-461 1594,-461"/>
<polygon fill="none" stroke="black" points="1594,-461 1594,-484 1693,-484 1693,-461 1594,-461"/>
<text text-anchor="start" x="1619" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.2/24</text>
<polygon fill="#b2f379" stroke="none" points="869,-433 869,-456 1071,-456 1071,-433 869,-433"/>
<polygon fill="none" stroke="black" points="869,-433 869,-456 1071,-456 1071,-433 869,-433"/>
<text text-anchor="start" x="952.5" y="-442" font-family="Helvetica,sans-Serif" font-size="10.00">private2</text>
<polygon fill="#c079f3" stroke="none" points="1076,-433 1076,-456 1279,-456 1279,-433 1076,-433"/>
<polygon fill="none" stroke="black" points="1076,-433 1076,-456 1279,-456 1279,-433 1076,-433"/>
<text text-anchor="start" x="1160" y="-442" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#b2f379" stroke="none" points="1284,-433 1284,-456 1485,-456 1485,-433 1284,-433"/>
<polygon fill="none" stroke="black" points="1284,-433 1284,-456 1485,-456 1485,-433 1284,-433"/>
<text text-anchor="start" x="1367" y="-442" font-family="Helvetica,sans-Serif" font-size="10.00">private2</text>
<polygon fill="#c079f3" stroke="none" points="1490,-433 1490,-456 1693,-456 1693,-433 1490,-433"/>
<polygon fill="none" stroke="black" points="1490,-433 1490,-456 1693,-456 1693,-433 1490,-433"/>
<text text-anchor="start" x="1574" y="-442" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#ff9933" stroke="none" points="869,-405 869,-428 1279,-428 1279,-405 869,-405"/>
<polygon fill="none" stroke="black" points="869,-405 869,-428 1279,-428 1279,-405 869,-405"/>
<text text-anchor="start" x="1058.5" y="-414" font-family="Helvetica,sans-Serif" font-size="10.00">router1</text>
<polygon fill="#ff9933" stroke="none" points="1284,-405 1284,-428 1693,-428 1693,-405 1284,-405"/>
<polygon fill="none" stroke="black" points="1284,-405 1284,-428 1693,-428 1693,-405 1284,-405"/>
<text text-anchor="start" x="1473" y="-414" font-family="Helvetica,sans-Serif" font-size="10.00">router2</text>
<polygon fill="#ffcc00" stroke="none" points="869,-377 869,-400 1693,-400 1693,-377 869,-377"/>
<polygon fill="none" stroke="black" points="869,-377 869,-400 1693,-400 1693,-377 869,-377"/>
<text text-anchor="start" x="1250.5" y="-386" font-family="Helvetica,sans-Serif" font-size="10.00">[19] patch&#45;tun</text>
</g>
<!-- br_ex&#45;&gt;network_br_int -->
<g id="edge19" class="edge"><title>br_ex:qg_e6c19c2c_8c:s&#45;&gt;network_br_int:qr_04542d8f_13:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M1178,-656C1178,-529.646 918,-667.354 918,-541"/>
</g>
<!-- br_ex&#45;&gt;network_br_int -->
<g id="edge20" class="edge"><title>br_ex:qg_e6c19c2c_8c:s&#45;&gt;network_br_int:qr_e503ba9c_89:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M1178,-656C1178,-599.722 1125,-597.278 1125,-541"/>
</g>
<!-- br_ex&#45;&gt;network_br_int -->
<g id="edge21" class="edge"><title>br_ex:qg_718e237a_3a:s&#45;&gt;network_br_int:qr_fb2585a7_bd:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M1280,-656C1280,-599.722 1333,-597.278 1333,-541"/>
</g>
<!-- br_ex&#45;&gt;network_br_int -->
<g id="edge22" class="edge"><title>br_ex:qg_718e237a_3a:s&#45;&gt;network_br_int:qr_5de9034a_db:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M1280,-656C1280,-529.646 1540,-667.354 1540,-541"/>
</g>
<!-- network_br_tun -->
<g id="node9" class="node"><title>network_br_tun</title>
<polygon fill="white" stroke="none" points="1227.5,-204 1227.5,-264 1332.5,-264 1332.5,-204 1227.5,-204"/>
<polygon fill="white" stroke="none" points="1233,-237 1233,-259 1328,-259 1328,-237 1233,-237"/>
<text text-anchor="start" x="1254.5" y="-245.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_tun</text>
<polygon fill="#ffcc00" stroke="none" points="1233,-209 1233,-232 1328,-232 1328,-209 1233,-209"/>
<polygon fill="none" stroke="black" points="1233,-209 1233,-232 1328,-232 1328,-209 1233,-209"/>
<text text-anchor="start" x="1254.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;int</text>
</g>
<!-- network_br_int&#45;&gt;network_br_tun -->
<g id="edge18" class="edge"><title>network_br_int:patch_tun:s&#45;&gt;network_br_tun:patch_int:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M1281,-376C1281,-312.444 1281,-296.556 1281,-233"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

View File

@ -0,0 +1,92 @@
digraph DON_network {
graph [fontsize=10 fontname="Helvetica"];
node [fontsize=10 fontname="Helvetica"];
rankdir = TB;
ranksep = 1;
concentrate = true;
compound = true;
edge [dir=none]
subgraph cluster_NetworkNode {
NetworkNode [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="red">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="yellow" PORT="NetworkNode">Network Node</TD>
</TR>
</TABLE>>];
}
subgraph cluster_OVS {
style=filled
subgraph cluster_br_ex {
br_ex [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="white" PORT="OVSbr_ex">OVS br_ex</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="router1">router1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="172.24.4.3/24">172.24.4.3/24</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="qg_757bf552_73">[2] qg-757bf552-73</TD>
</TR>
</TABLE>>];
}
subgraph cluster_network_br_int {
network_br_int [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_int">OVS br_int</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_43b83157_3b">[8] qr-43b83157-3b</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tap59f90a3b_f5">[5] tap59f90a3b-f5</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_43b83157_3btag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tap59f90a3b_f5tag_2">VLAN tag:2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_43b83157_3b10.10.0.1/24">10.10.0.1/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tap59f90a3b_f510.10.0.2/24">10.10.0.2/24</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#c079f3" PORT="private1">private1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ff9933" PORT="router1">router1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ffcc00" PORT="patch_tun">[1] patch-tun</TD>
</TR>
</TABLE>>];
}
subgraph cluster_network_br_tun {
network_br_tun [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_tun">OVS br_tun</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ffcc00" PORT="patch_int">[1] patch-int</TD>
</TR>
</TABLE>>];
}
}
NetworkNode:s -> br_ex:n [color = "#0066cc", penwidth = "4", style="invis"]
network_br_int:patch_tun:s -> network_br_tun:patch_int:n [color = "#0066cc", penwidth = "4"]
br_ex:qg_757bf552_73:s -> network_br_int:qr_43b83157_3b:n [color = "#0066cc", penwidth = "4"]
}

View File

@ -0,0 +1,100 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.36.0 (20140111.2315)
-->
<!-- Title: DON_network Pages: 1 -->
<svg width="274pt" height="704pt"
viewBox="0.00 0.00 274.00 704.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 700)">
<title>DON_network</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-700 270,-700 270,4 -4,4"/>
<g id="clust1" class="cluster"><title>cluster_NetworkNode</title>
<polygon fill="none" stroke="black" points="26,-632 26,-688 144,-688 144,-632 26,-632"/>
</g>
<g id="clust2" class="cluster"><title>cluster_OVS</title>
<polygon fill="lightgrey" stroke="black" points="8,-8 8,-584 258,-584 258,-8 8,-8"/>
</g>
<g id="clust3" class="cluster"><title>cluster_br_ex</title>
<polygon fill="lightgrey" stroke="black" points="16,-436 16,-576 154,-576 154,-436 16,-436"/>
</g>
<g id="clust4" class="cluster"><title>cluster_network_br_int</title>
<polygon fill="lightgrey" stroke="black" points="16,-156 16,-380 250,-380 250,-156 16,-156"/>
</g>
<g id="clust5" class="cluster"><title>cluster_network_br_tun</title>
<polygon fill="lightgrey" stroke="black" points="78,-16 78,-100 190,-100 190,-16 78,-16"/>
</g>
<!-- NetworkNode -->
<g id="node1" class="node"><title>NetworkNode</title>
<polygon fill="red" stroke="none" points="42.5,-644 42.5,-676 127.5,-676 127.5,-644 42.5,-644"/>
<polygon fill="yellow" stroke="none" points="48,-649 48,-671 123,-671 123,-649 48,-649"/>
<text text-anchor="start" x="53.5" y="-657.5" font-family="Helvetica,sans-Serif" font-size="10.00">Network Node</text>
</g>
<!-- br_ex -->
<g id="node2" class="node"><title>br_ex</title>
<polygon fill="white" stroke="none" points="32.5,-448 32.5,-564 137.5,-564 137.5,-448 32.5,-448"/>
<polygon fill="white" stroke="none" points="38,-537 38,-559 133,-559 133,-537 38,-537"/>
<text text-anchor="start" x="61" y="-545.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_ex</text>
<polygon fill="#ff9933" stroke="none" points="38,-509 38,-532 133,-532 133,-509 38,-509"/>
<polygon fill="none" stroke="black" points="38,-509 38,-532 133,-532 133,-509 38,-509"/>
<text text-anchor="start" x="70" y="-518" font-family="Helvetica,sans-Serif" font-size="10.00">router1</text>
<polygon fill="#ff9933" stroke="none" points="38,-481 38,-504 133,-504 133,-481 38,-481"/>
<polygon fill="none" stroke="black" points="38,-481 38,-504 133,-504 133,-481 38,-481"/>
<text text-anchor="start" x="55.5" y="-490" font-family="Helvetica,sans-Serif" font-size="10.00">172.24.4.3/24</text>
<polygon fill="#ff9933" stroke="none" points="38,-453 38,-476 133,-476 133,-453 38,-453"/>
<polygon fill="none" stroke="black" points="38,-453 38,-476 133,-476 133,-453 38,-453"/>
<text text-anchor="start" x="44.5" y="-462" font-family="Helvetica,sans-Serif" font-size="10.00">[2] qg&#45;757bf552&#45;73</text>
</g>
<!-- NetworkNode&#45;&gt;br_ex -->
<!-- network_br_int -->
<g id="node3" class="node"><title>network_br_int</title>
<polygon fill="white" stroke="none" points="32.5,-168 32.5,-368 233.5,-368 233.5,-168 32.5,-168"/>
<polygon fill="white" stroke="none" points="38,-341 38,-363 229,-363 229,-341 38,-341"/>
<text text-anchor="start" x="109" y="-349.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_int</text>
<polygon fill="#c079f3" stroke="none" points="38,-313 38,-336 133,-336 133,-313 38,-313"/>
<polygon fill="none" stroke="black" points="38,-313 38,-336 133,-336 133,-313 38,-313"/>
<text text-anchor="start" x="44.5" y="-322" font-family="Helvetica,sans-Serif" font-size="10.00">[8] qr&#45;43b83157&#45;3b</text>
<polygon fill="#c079f3" stroke="none" points="138,-313 138,-336 229,-336 229,-313 138,-313"/>
<polygon fill="none" stroke="black" points="138,-313 138,-336 229,-336 229,-313 138,-313"/>
<text text-anchor="start" x="144" y="-322" font-family="Helvetica,sans-Serif" font-size="10.00">[5] tap59f90a3b&#45;f5</text>
<polygon fill="#c079f3" stroke="none" points="38,-285 38,-308 133,-308 133,-285 38,-285"/>
<polygon fill="none" stroke="black" points="38,-285 38,-308 133,-308 133,-285 38,-285"/>
<text text-anchor="start" x="59.5" y="-294" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="138,-285 138,-308 229,-308 229,-285 138,-285"/>
<polygon fill="none" stroke="black" points="138,-285 138,-308 229,-308 229,-285 138,-285"/>
<text text-anchor="start" x="157.5" y="-294" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="38,-257 38,-280 133,-280 133,-257 38,-257"/>
<polygon fill="none" stroke="black" points="38,-257 38,-280 133,-280 133,-257 38,-257"/>
<text text-anchor="start" x="58" y="-266" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.1/24</text>
<polygon fill="#c079f3" stroke="none" points="138,-257 138,-280 229,-280 229,-257 138,-257"/>
<polygon fill="none" stroke="black" points="138,-257 138,-280 229,-280 229,-257 138,-257"/>
<text text-anchor="start" x="156" y="-266" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.2/24</text>
<polygon fill="#c079f3" stroke="none" points="38,-229 38,-252 229,-252 229,-229 38,-229"/>
<polygon fill="none" stroke="black" points="38,-229 38,-252 229,-252 229,-229 38,-229"/>
<text text-anchor="start" x="116" y="-238" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#ff9933" stroke="none" points="38,-201 38,-224 229,-224 229,-201 38,-201"/>
<polygon fill="none" stroke="black" points="38,-201 38,-224 229,-224 229,-201 38,-201"/>
<text text-anchor="start" x="118" y="-210" font-family="Helvetica,sans-Serif" font-size="10.00">router1</text>
<polygon fill="#ffcc00" stroke="none" points="38,-173 38,-196 229,-196 229,-173 38,-173"/>
<polygon fill="none" stroke="black" points="38,-173 38,-196 229,-196 229,-173 38,-173"/>
<text text-anchor="start" x="106" y="-182" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;tun</text>
</g>
<!-- br_ex&#45;&gt;network_br_int -->
<g id="edge3" class="edge"><title>br_ex:qg_757bf552_73:s&#45;&gt;network_br_int:qr_43b83157_3b:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M86,-452C86,-400.887 85,-388.113 85,-337"/>
</g>
<!-- network_br_tun -->
<g id="node4" class="node"><title>network_br_tun</title>
<polygon fill="white" stroke="none" points="94,-28 94,-88 174,-88 174,-28 94,-28"/>
<polygon fill="white" stroke="none" points="99,-61 99,-83 169,-83 169,-61 99,-61"/>
<text text-anchor="start" x="108" y="-69.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_tun</text>
<polygon fill="#ffcc00" stroke="none" points="99,-33 99,-56 169,-56 169,-33 99,-33"/>
<polygon fill="none" stroke="black" points="99,-33 99,-56 169,-56 169,-33 99,-33"/>
<text text-anchor="start" x="108" y="-42" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;int</text>
</g>
<!-- network_br_int&#45;&gt;network_br_tun -->
<g id="edge2" class="edge"><title>network_br_int:patch_tun:s&#45;&gt;network_br_tun:patch_int:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M134,-172C134,-120.889 134,-108.111 134,-57"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

@ -0,0 +1,27 @@
<!DOCTYPE html>
<html>
<head>
<title>DON: Ping Tracer</title>
<link rel="stylesheet" type="text/css" href="don.css">
</head>
<body>
<div id="internal">
<table width="100%">
<th class="title">
DON: Ping Tracer
</th>
<tr>
<td align="center" class="clickme">
<button class="myButton"
onClick="history.go(-1)">
Back</button>
</td>
</tr>
<tr>
<td><object class="emb" data="ping.svg" width="100%" height="850" type="image/svg+xml" id="ping_svg"></object></td>
</tr>
</table>
</div>
</body>
</html>

View File

@ -0,0 +1,278 @@
digraph DON_DON {
graph [fontsize=10 fontname="Helvetica"];
node [fontsize=10 fontname="Helvetica"];
rankdir = TB;
ranksep = 1;
concentrate = true;
compound = true;
edge [dir=none]
subgraph cluster_DONComputeNode {
style=filled
subgraph cluster_ComputeNode {
ComputeNode [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="red">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="yellow" PORT="ComputeNode">Compute Node</TD>
</TR>
</TABLE>>];
}
subgraph cluster_Nova {
style=filled
subgraph cluster_VMs {
VMs [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="7" BORDER="0" BGCOLOR="white" PORT="VMs">VMs</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">VM1-1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">VM1-2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">VM3-1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">VM3-2</TD>
<TD ROWSPAN="1" COLSPAN="3" BGCOLOR="#909090">VM4</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">private1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">private1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">private2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">private2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">public</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">private2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">private1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="10023">10.0.2.3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="10024">10.0.2.4</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="10033">10.0.3.3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="10034">10.0.3.4</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="1722445">172.24.4.5</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="10036">10.0.3.6</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="10026">10.0.2.6</TD>
</TR>
</TABLE>>];
}
subgraph cluster_LinuxBridge {
LinuxBridge [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="7" BORDER="0" BGCOLOR="white" PORT="LinuxBridge">Linux Bridge</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="tape0d697f2_cb">tape0d697f2-cb</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapbd4f1f72_5f">tapbd4f1f72-5f</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="tapbd96ca7d_5e">tapbd96ca7d-5e</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tap4441e3a6_f2">tap4441e3a6-f2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapce3d7b20_1d">tapce3d7b20-1d</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapf0841d56_02">tapf0841d56-02</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapfbb76083_60">tapfbb76083-60</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qbre0d697f2_cb">qbre0d697f2-cb</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qbrbd4f1f72_5f">qbrbd4f1f72-5f</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qbrbd96ca7d_5e">qbrbd96ca7d-5e</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qbr4441e3a6_f2">qbr4441e3a6-f2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qbrce3d7b20_1d">qbrce3d7b20-1d</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qbrf0841d56_02">qbrf0841d56-02</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qbrfbb76083_60">qbrfbb76083-60</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qvbe0d697f2_cb">qvbe0d697f2-cb</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvbbd4f1f72_5f">qvbbd4f1f72-5f</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qvbbd96ca7d_5e">qvbbd96ca7d-5e</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvb4441e3a6_f2">qvb4441e3a6-f2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvbce3d7b20_1d">qvbce3d7b20-1d</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvbf0841d56_02">qvbf0841d56-02</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvbfbb76083_60">qvbfbb76083-60</TD>
</TR>
</TABLE>>];
}
}
subgraph cluster_OVS {
style=filled
subgraph cluster_compute_br_int {
compute_br_int [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="7" BORDER="0" BGCOLOR="white" PORT="OVSbr_int">OVS br_int</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qvoe0d697f2_cb">[9] qvoe0d697f2-cb</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvobd4f1f72_5f">[10] qvobd4f1f72-5f</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qvobd96ca7d_5e">[11] qvobd96ca7d-5e</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvo4441e3a6_f2">[12] qvo4441e3a6-f2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvoce3d7b20_1d">[17] qvoce3d7b20-1d</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvof0841d56_02">[16] qvof0841d56-02</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvofbb76083_60">[15] qvofbb76083-60</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvoe0d697f2_cbtag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvobd4f1f72_5ftag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvobd96ca7d_5etag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvo4441e3a6_f2tag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvoce3d7b20_1dtag_4">VLAN tag:4</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvof0841d56_02tag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvofbb76083_60tag_2">VLAN tag:2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="7" BGCOLOR="#909090" PORT="patch_tun">[1] patch-tun</TD>
</TR>
</TABLE>>];
}
subgraph cluster_compute_br_tun {
compute_br_tun [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="7" BORDER="0" BGCOLOR="white" PORT="OVSbr_tun">OVS br_tun</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="7" BGCOLOR="#909090" PORT="patch_int">[1] patch-int</TD>
</TR>
</TABLE>>];
}
}
ComputeNode:s -> VMs:n [color = "#909090", penwidth = "4", style="invis"]
VMs:10023:s -> LinuxBridge:tape0d697f2_cb:n [color = "#009900", penwidth = "4"]
VMs:10024:s -> LinuxBridge:tapbd4f1f72_5f:n [color = "#909090", penwidth = "4"]
VMs:10033:s -> LinuxBridge:tapbd96ca7d_5e:n [color = "#009900", penwidth = "4"]
VMs:10034:s -> LinuxBridge:tap4441e3a6_f2:n [color = "#909090", penwidth = "4"]
VMs:1722445:s -> LinuxBridge:tapce3d7b20_1d:n [color = "#909090", penwidth = "4"]
VMs:10036:s -> LinuxBridge:tapf0841d56_02:n [color = "#909090", penwidth = "4"]
VMs:10026:s -> LinuxBridge:tapfbb76083_60:n [color = "#909090", penwidth = "4"]
LinuxBridge:qvbe0d697f2_cb:s -> compute_br_int:qvoe0d697f2_cb:n [color = "#009900", penwidth = "4"]
LinuxBridge:qvbbd4f1f72_5f:s -> compute_br_int:qvobd4f1f72_5f:n [color = "#909090", penwidth = "4"]
LinuxBridge:qvbbd96ca7d_5e:s -> compute_br_int:qvobd96ca7d_5e:n [color = "#009900", penwidth = "4"]
LinuxBridge:qvb4441e3a6_f2:s -> compute_br_int:qvo4441e3a6_f2:n [color = "#909090", penwidth = "4"]
LinuxBridge:qvbce3d7b20_1d:s -> compute_br_int:qvoce3d7b20_1d:n [color = "#909090", penwidth = "4"]
LinuxBridge:qvbf0841d56_02:s -> compute_br_int:qvof0841d56_02:n [color = "#909090", penwidth = "4"]
LinuxBridge:qvbfbb76083_60:s -> compute_br_int:qvofbb76083_60:n [color = "#909090", penwidth = "4"]
compute_br_int:patch_tun:s -> compute_br_tun:patch_int:n [color = "#909090", penwidth = "4"]
}
subgraph cluster_DONNetworkNode {
style=filled
subgraph cluster_NetworkNode {
NetworkNode [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="red">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="yellow" PORT="NetworkNode">Network Node</TD>
</TR>
</TABLE>>];
}
subgraph cluster_OVS {
style=filled
subgraph cluster_br_ex {
br_ex [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_ex">OVS br_ex</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="router1">router1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="router2">router2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="172.24.4.3/24">172.24.4.3/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="172.24.4.4/24">172.24.4.4/24</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qg_eb8796fb_83">[2] qg-eb8796fb-83</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qg_e2b1b0d3_a8">[3] qg-e2b1b0d3-a8</TD>
</TR>
</TABLE>>];
}
subgraph cluster_network_br_int {
network_br_int [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="8" BORDER="0" BGCOLOR="white" PORT="OVSbr_int">OVS br_int</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qr_09a15e37_ca">[8] qr-09a15e37-ca</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd0828ef0_eb">[6] tapd0828ef0-eb</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qr_622abba5_e2">[7] qr-622abba5-e2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd6f091a2_c0">[5] tapd6f091a2-c0</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_361be2af_e5">[13] qr-361be2af-e5</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd6f091a2_c0">[5] tapd6f091a2-c0</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_b66b902a_36">[14] qr-b66b902a-36</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd0828ef0_eb">[6] tapd0828ef0-eb</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_09a15e37_catag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd0828ef0_ebtag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_622abba5_e2tag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd6f091a2_c0tag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_361be2af_e5tag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd6f091a2_c0tag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_b66b902a_36tag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd0828ef0_ebtag_3">VLAN tag:3</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_09a15e37_ca10.0.3.1/24">10.0.3.1/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd0828ef0_eb10.0.3.2/24">10.0.3.2/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_622abba5_e210.0.2.1/24">10.0.2.1/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd6f091a2_c010.0.2.2/24">10.0.2.2/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_361be2af_e510.0.2.5/24">10.0.2.5/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd6f091a2_c010.0.2.2/24">10.0.2.2/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_b66b902a_3610.0.3.5/24">10.0.3.5/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd0828ef0_eb10.0.3.2/24">10.0.3.2/24</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#909090" PORT="private2">private2</TD>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#909090" PORT="private1">private1</TD>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#909090" PORT="private1">private1</TD>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#909090" PORT="private2">private2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="4" BGCOLOR="#909090" PORT="router1">router1</TD>
<TD ROWSPAN="1" COLSPAN="4" BGCOLOR="#909090" PORT="router2">router2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="8" BGCOLOR="#909090" PORT="patch_tun">[1] patch-tun</TD>
</TR>
</TABLE>>];
}
subgraph cluster_network_br_tun {
network_br_tun [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="7" BORDER="0" BGCOLOR="white" PORT="OVSbr_tun">OVS br_tun</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="7" BGCOLOR="#909090" PORT="patch_int">[1] patch-int</TD>
</TR>
</TABLE>>];
}
}
NetworkNode:s -> br_ex:n [color = "#909090", penwidth = "4", style="invis"]
network_br_int:patch_tun:s -> network_br_tun:patch_int:n [color = "#909090", penwidth = "4"]
br_ex:qg_e2b1b0d3_a8:s -> network_br_int:qr_361be2af_e5:n [color = "#909090", penwidth = "4"]
br_ex:qg_e2b1b0d3_a8:s -> network_br_int:qr_b66b902a_36:n [color = "#909090", penwidth = "4"]
br_ex:qg_eb8796fb_83:s -> network_br_int:qr_09a15e37_ca:n [color = "#909090", penwidth = "4"]
br_ex:qg_eb8796fb_83:s -> network_br_int:qr_622abba5_e2:n [color = "#909090", penwidth = "4"]
}
}

View File

@ -0,0 +1 @@
{"src": "10.0.2.3", "dst_info": {"ip": "10.0.3.3", "ports": {"brctl": "qbrbd96ca7d-5e", "qvo": "qvobd96ca7d-5e", "tap": "tapbd96ca7d-5e", "qvb": "qvbbd96ca7d-5e"}, "tag": "3", "pass": ["qbrbd96ca7d-5e", "qvobd96ca7d-5e", "tapbd96ca7d-5e", "qvbbd96ca7d-5e"], "fail": ["qbrbd96ca7d-5e", "qvobd96ca7d-5e", "tapbd96ca7d-5e", "qvbbd96ca7d-5e"], "counts": {"brctl": 2, "qvo": 2, "tap": 2, "qvb": 2}, "pids": [19059, 19060, 19064, 19068]}, "dst": "10.0.3.3", "ping_pass": true, "error": "", "net_info": {"hops": [{"ip": "10.0.2.1", "nms": "qrouter-dc5f8d60-ae94-4879-b8ff-ec5daa33a66a", "dev": "qr-622abba5-e2"}, {"nms": "qrouter-dc5f8d60-ae94-4879-b8ff-ec5daa33a66a", "dev": "qr-09a15e37-ca"}], "fail": ["qr-622abba5-e2", "qr-09a15e37-ca"], "pids": [19072, 19075], "counts": {"qr-09a15e37-ca": 2, "qr-622abba5-e2": 2}, "pass": ["qr-622abba5-e2", "qr-09a15e37-ca"]}, "src_info": {"ip": "10.0.2.3", "ports": {"brctl": "qbre0d697f2-cb", "qvo": "qvoe0d697f2-cb", "tap": "tape0d697f2-cb", "qvb": "qvbe0d697f2-cb"}, "tag": "2", "pass": ["qbre0d697f2-cb", "qvoe0d697f2-cb", "tape0d697f2-cb", "qvbe0d697f2-cb"], "fail": ["qbre0d697f2-cb", "qvoe0d697f2-cb", "tape0d697f2-cb", "qvbe0d697f2-cb"], "counts": {"brctl": 2, "qvo": 2, "tap": 2, "qvb": 2}, "pids": [19049, 19051, 19053, 19054]}}

View File

@ -0,0 +1,473 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.36.0 (20140111.2315)
-->
<!-- Title: DON_DON Pages: 1 -->
<svg width="1710pt" height="916pt"
viewBox="0.00 0.00 1710.00 916.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 912)">
<title>DON_DON</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-912 1706,-912 1706,4 -4,4"/>
<g id="clust1" class="cluster"><title>cluster_DONComputeNode</title>
<polygon fill="lightgrey" stroke="black" points="8,-8 8,-900 816,-900 816,-8 8,-8"/>
</g>
<g id="clust2" class="cluster"><title>cluster_ComputeNode</title>
<polygon fill="lightgrey" stroke="black" points="352,-836 352,-892 472,-892 472,-836 352,-836"/>
</g>
<g id="clust3" class="cluster"><title>cluster_Nova</title>
<polygon fill="lightgrey" stroke="black" points="79,-394 79,-788 741,-788 741,-394 79,-394"/>
</g>
<g id="clust4" class="cluster"><title>cluster_VMs</title>
<polygon fill="lightgrey" stroke="black" points="202,-640 202,-780 622,-780 622,-640 202,-640"/>
</g>
<g id="clust5" class="cluster"><title>cluster_LinuxBridge</title>
<polygon fill="lightgrey" stroke="black" points="87,-402 87,-542 733,-542 733,-402 87,-402"/>
</g>
<g id="clust6" class="cluster"><title>cluster_OVS</title>
<polygon fill="lightgrey" stroke="black" points="16,-16 16,-312 808,-312 808,-16 16,-16"/>
</g>
<g id="clust7" class="cluster"><title>cluster_compute_br_int</title>
<polygon fill="lightgrey" stroke="black" points="24,-164 24,-304 800,-304 800,-164 24,-164"/>
</g>
<g id="clust8" class="cluster"><title>cluster_compute_br_tun</title>
<polygon fill="lightgrey" stroke="black" points="343,-24 343,-108 481,-108 481,-24 343,-24"/>
</g>
<g id="clust9" class="cluster"><title>cluster_DONNetworkNode</title>
<polygon fill="lightgrey" stroke="black" points="824,-176 824,-900 1694,-900 1694,-176 824,-176"/>
</g>
<g id="clust11" class="cluster"><title>cluster_OVS</title>
<polygon fill="lightgrey" stroke="black" points="832,-184 832,-788 1686,-788 1686,-184 832,-184"/>
</g>
<g id="clust12" class="cluster"><title>cluster_br_ex</title>
<polygon fill="lightgrey" stroke="black" points="1088,-640 1088,-780 1326,-780 1326,-640 1088,-640"/>
</g>
<g id="clust13" class="cluster"><title>cluster_network_br_int</title>
<polygon fill="lightgrey" stroke="black" points="840,-360 840,-584 1678,-584 1678,-360 840,-360"/>
</g>
<g id="clust14" class="cluster"><title>cluster_network_br_tun</title>
<polygon fill="lightgrey" stroke="black" points="1189,-192 1189,-276 1327,-276 1327,-192 1189,-192"/>
</g>
<g id="clust10" class="cluster"><title>cluster_NetworkNode</title>
<polygon fill="lightgrey" stroke="black" points="1148,-836 1148,-892 1266,-892 1266,-836 1148,-836"/>
</g>
<!-- ComputeNode -->
<g id="node1" class="node"><title>ComputeNode</title>
<polygon fill="red" stroke="none" points="368,-848 368,-880 456,-880 456,-848 368,-848"/>
<polygon fill="yellow" stroke="none" points="373,-853 373,-875 451,-875 451,-853 373,-853"/>
<text text-anchor="start" x="378.5" y="-861.5" font-family="Helvetica,sans-Serif" font-size="10.00">Compute Node</text>
</g>
<!-- VMs -->
<g id="node2" class="node"><title>VMs</title>
<polygon fill="white" stroke="none" points="218.5,-652 218.5,-768 605.5,-768 605.5,-652 218.5,-652"/>
<polygon fill="white" stroke="none" points="224,-741 224,-763 601,-763 601,-741 224,-741"/>
<text text-anchor="start" x="402" y="-749.5" font-family="Helvetica,sans-Serif" font-size="10.00">VMs</text>
<polygon fill="#909090" stroke="none" points="224,-713 224,-736 273,-736 273,-713 224,-713"/>
<polygon fill="none" stroke="black" points="224,-713 224,-736 273,-736 273,-713 224,-713"/>
<text text-anchor="start" x="234" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">VM1&#45;1</text>
<polygon fill="#909090" stroke="none" points="278,-713 278,-736 326,-736 326,-713 278,-713"/>
<polygon fill="none" stroke="black" points="278,-713 278,-736 326,-736 326,-713 278,-713"/>
<text text-anchor="start" x="287.5" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">VM1&#45;2</text>
<polygon fill="#909090" stroke="none" points="331,-713 331,-736 379,-736 379,-713 331,-713"/>
<polygon fill="none" stroke="black" points="331,-713 331,-736 379,-736 379,-713 331,-713"/>
<text text-anchor="start" x="340.5" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">VM3&#45;1</text>
<polygon fill="#909090" stroke="none" points="384,-713 384,-736 432,-736 432,-713 384,-713"/>
<polygon fill="none" stroke="black" points="384,-713 384,-736 432,-736 432,-713 384,-713"/>
<text text-anchor="start" x="393.5" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">VM3&#45;2</text>
<polygon fill="#909090" stroke="none" points="437,-713 437,-736 601,-736 601,-713 437,-713"/>
<polygon fill="none" stroke="black" points="437,-713 437,-736 601,-736 601,-713 437,-713"/>
<text text-anchor="start" x="508.5" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">VM4</text>
<polygon fill="#909090" stroke="none" points="224,-685 224,-708 273,-708 273,-685 224,-685"/>
<polygon fill="none" stroke="black" points="224,-685 224,-708 273,-708 273,-685 224,-685"/>
<text text-anchor="start" x="231" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#909090" stroke="none" points="278,-685 278,-708 326,-708 326,-685 278,-685"/>
<polygon fill="none" stroke="black" points="278,-685 278,-708 326,-708 326,-685 278,-685"/>
<text text-anchor="start" x="284.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#909090" stroke="none" points="331,-685 331,-708 379,-708 379,-685 331,-685"/>
<polygon fill="none" stroke="black" points="331,-685 331,-708 379,-708 379,-685 331,-685"/>
<text text-anchor="start" x="337.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private2</text>
<polygon fill="#909090" stroke="none" points="384,-685 384,-708 432,-708 432,-685 384,-685"/>
<polygon fill="none" stroke="black" points="384,-685 384,-708 432,-708 432,-685 384,-685"/>
<text text-anchor="start" x="390.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private2</text>
<polygon fill="#909090" stroke="none" points="437,-685 437,-708 495,-708 495,-685 437,-685"/>
<polygon fill="none" stroke="black" points="437,-685 437,-708 495,-708 495,-685 437,-685"/>
<text text-anchor="start" x="453" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">public</text>
<polygon fill="#909090" stroke="none" points="500,-685 500,-708 548,-708 548,-685 500,-685"/>
<polygon fill="none" stroke="black" points="500,-685 500,-708 548,-708 548,-685 500,-685"/>
<text text-anchor="start" x="506.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private2</text>
<polygon fill="#909090" stroke="none" points="553,-685 553,-708 601,-708 601,-685 553,-685"/>
<polygon fill="none" stroke="black" points="553,-685 553,-708 601,-708 601,-685 553,-685"/>
<text text-anchor="start" x="559.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#b2f379" stroke="none" points="224,-657 224,-680 273,-680 273,-657 224,-657"/>
<polygon fill="none" stroke="black" points="224,-657 224,-680 273,-680 273,-657 224,-657"/>
<text text-anchor="start" x="230.5" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.3</text>
<polygon fill="#909090" stroke="none" points="278,-657 278,-680 326,-680 326,-657 278,-657"/>
<polygon fill="none" stroke="black" points="278,-657 278,-680 326,-680 326,-657 278,-657"/>
<text text-anchor="start" x="284" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.4</text>
<polygon fill="#b2f379" stroke="none" points="331,-657 331,-680 379,-680 379,-657 331,-657"/>
<polygon fill="none" stroke="black" points="331,-657 331,-680 379,-680 379,-657 331,-657"/>
<text text-anchor="start" x="337" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.3</text>
<polygon fill="#909090" stroke="none" points="384,-657 384,-680 432,-680 432,-657 384,-657"/>
<polygon fill="none" stroke="black" points="384,-657 384,-680 432,-680 432,-657 384,-657"/>
<text text-anchor="start" x="390" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.4</text>
<polygon fill="#909090" stroke="none" points="437,-657 437,-680 495,-680 495,-657 437,-657"/>
<polygon fill="none" stroke="black" points="437,-657 437,-680 495,-680 495,-657 437,-657"/>
<text text-anchor="start" x="443" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">172.24.4.5</text>
<polygon fill="#909090" stroke="none" points="500,-657 500,-680 548,-680 548,-657 500,-657"/>
<polygon fill="none" stroke="black" points="500,-657 500,-680 548,-680 548,-657 500,-657"/>
<text text-anchor="start" x="506" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.6</text>
<polygon fill="#909090" stroke="none" points="553,-657 553,-680 601,-680 601,-657 553,-657"/>
<polygon fill="none" stroke="black" points="553,-657 553,-680 601,-680 601,-657 553,-657"/>
<text text-anchor="start" x="559" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.6</text>
</g>
<!-- ComputeNode&#45;&gt;VMs -->
<!-- LinuxBridge -->
<g id="node3" class="node"><title>LinuxBridge</title>
<polygon fill="white" stroke="none" points="103,-414 103,-530 717,-530 717,-414 103,-414"/>
<polygon fill="white" stroke="none" points="108,-503 108,-525 712,-525 712,-503 108,-503"/>
<text text-anchor="start" x="382.5" y="-511.5" font-family="Helvetica,sans-Serif" font-size="10.00">Linux Bridge</text>
<polygon fill="#b2f379" stroke="none" points="108,-475 108,-498 191,-498 191,-475 108,-475"/>
<polygon fill="none" stroke="black" points="108,-475 108,-498 191,-498 191,-475 108,-475"/>
<text text-anchor="start" x="116" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tape0d697f2&#45;cb</text>
<polygon fill="#909090" stroke="none" points="196,-475 196,-498 273,-498 273,-475 196,-475"/>
<polygon fill="none" stroke="black" points="196,-475 196,-498 273,-498 273,-475 196,-475"/>
<text text-anchor="start" x="203" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tapbd4f1f72&#45;5f</text>
<polygon fill="#b2f379" stroke="none" points="278,-475 278,-498 362,-498 362,-475 278,-475"/>
<polygon fill="none" stroke="black" points="278,-475 278,-498 362,-498 362,-475 278,-475"/>
<text text-anchor="start" x="285" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tapbd96ca7d&#45;5e</text>
<polygon fill="#909090" stroke="none" points="367,-475 367,-498 449,-498 449,-475 367,-475"/>
<polygon fill="none" stroke="black" points="367,-475 367,-498 449,-498 449,-475 367,-475"/>
<text text-anchor="start" x="374.5" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tap4441e3a6&#45;f2</text>
<polygon fill="#909090" stroke="none" points="454,-475 454,-498 538,-498 538,-475 454,-475"/>
<polygon fill="none" stroke="black" points="454,-475 454,-498 538,-498 538,-475 454,-475"/>
<text text-anchor="start" x="461" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tapce3d7b20&#45;1d</text>
<polygon fill="#909090" stroke="none" points="543,-475 543,-498 625,-498 625,-475 543,-475"/>
<polygon fill="none" stroke="black" points="543,-475 543,-498 625,-498 625,-475 543,-475"/>
<text text-anchor="start" x="550.5" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tapf0841d56&#45;02</text>
<polygon fill="#909090" stroke="none" points="630,-475 630,-498 712,-498 712,-475 630,-475"/>
<polygon fill="none" stroke="black" points="630,-475 630,-498 712,-498 712,-475 630,-475"/>
<text text-anchor="start" x="637.5" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tapfbb76083&#45;60</text>
<polygon fill="#b2f379" stroke="none" points="108,-447 108,-470 191,-470 191,-447 108,-447"/>
<polygon fill="none" stroke="black" points="108,-447 108,-470 191,-470 191,-447 108,-447"/>
<text text-anchor="start" x="116" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbre0d697f2&#45;cb</text>
<polygon fill="#909090" stroke="none" points="196,-447 196,-470 273,-470 273,-447 196,-447"/>
<polygon fill="none" stroke="black" points="196,-447 196,-470 273,-470 273,-447 196,-447"/>
<text text-anchor="start" x="203" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbrbd4f1f72&#45;5f</text>
<polygon fill="#b2f379" stroke="none" points="278,-447 278,-470 362,-470 362,-447 278,-447"/>
<polygon fill="none" stroke="black" points="278,-447 278,-470 362,-470 362,-447 278,-447"/>
<text text-anchor="start" x="285" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbrbd96ca7d&#45;5e</text>
<polygon fill="#909090" stroke="none" points="367,-447 367,-470 449,-470 449,-447 367,-447"/>
<polygon fill="none" stroke="black" points="367,-447 367,-470 449,-470 449,-447 367,-447"/>
<text text-anchor="start" x="374.5" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbr4441e3a6&#45;f2</text>
<polygon fill="#909090" stroke="none" points="454,-447 454,-470 538,-470 538,-447 454,-447"/>
<polygon fill="none" stroke="black" points="454,-447 454,-470 538,-470 538,-447 454,-447"/>
<text text-anchor="start" x="461" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbrce3d7b20&#45;1d</text>
<polygon fill="#909090" stroke="none" points="543,-447 543,-470 625,-470 625,-447 543,-447"/>
<polygon fill="none" stroke="black" points="543,-447 543,-470 625,-470 625,-447 543,-447"/>
<text text-anchor="start" x="550.5" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbrf0841d56&#45;02</text>
<polygon fill="#909090" stroke="none" points="630,-447 630,-470 712,-470 712,-447 630,-447"/>
<polygon fill="none" stroke="black" points="630,-447 630,-470 712,-470 712,-447 630,-447"/>
<text text-anchor="start" x="637.5" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbrfbb76083&#45;60</text>
<polygon fill="#b2f379" stroke="none" points="108,-419 108,-442 191,-442 191,-419 108,-419"/>
<polygon fill="none" stroke="black" points="108,-419 108,-442 191,-442 191,-419 108,-419"/>
<text text-anchor="start" x="114.5" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvbe0d697f2&#45;cb</text>
<polygon fill="#909090" stroke="none" points="196,-419 196,-442 273,-442 273,-419 196,-419"/>
<polygon fill="none" stroke="black" points="196,-419 196,-442 273,-442 273,-419 196,-419"/>
<text text-anchor="start" x="202" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvbbd4f1f72&#45;5f</text>
<polygon fill="#b2f379" stroke="none" points="278,-419 278,-442 362,-442 362,-419 278,-419"/>
<polygon fill="none" stroke="black" points="278,-419 278,-442 362,-442 362,-419 278,-419"/>
<text text-anchor="start" x="284" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvbbd96ca7d&#45;5e</text>
<polygon fill="#909090" stroke="none" points="367,-419 367,-442 449,-442 449,-419 367,-419"/>
<polygon fill="none" stroke="black" points="367,-419 367,-442 449,-442 449,-419 367,-419"/>
<text text-anchor="start" x="373" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvb4441e3a6&#45;f2</text>
<polygon fill="#909090" stroke="none" points="454,-419 454,-442 538,-442 538,-419 454,-419"/>
<polygon fill="none" stroke="black" points="454,-419 454,-442 538,-442 538,-419 454,-419"/>
<text text-anchor="start" x="460" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvbce3d7b20&#45;1d</text>
<polygon fill="#909090" stroke="none" points="543,-419 543,-442 625,-442 625,-419 543,-419"/>
<polygon fill="none" stroke="black" points="543,-419 543,-442 625,-442 625,-419 543,-419"/>
<text text-anchor="start" x="549" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvbf0841d56&#45;02</text>
<polygon fill="#909090" stroke="none" points="630,-419 630,-442 712,-442 712,-419 630,-419"/>
<polygon fill="none" stroke="black" points="630,-419 630,-442 712,-442 712,-419 630,-419"/>
<text text-anchor="start" x="636" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvbfbb76083&#45;60</text>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge2" class="edge"><title>VMs:10023:s&#45;&gt;LinuxBridge:tape0d697f2_cb:n</title>
<path fill="none" stroke="#009900" stroke-width="4" d="M248,-656C248,-573.508 149,-581.492 149,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge3" class="edge"><title>VMs:10024:s&#45;&gt;LinuxBridge:tapbd4f1f72_5f:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M302,-656C302,-579.958 234,-575.042 234,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge4" class="edge"><title>VMs:10033:s&#45;&gt;LinuxBridge:tapbd96ca7d_5e:n</title>
<path fill="none" stroke="#009900" stroke-width="4" d="M355,-656C355,-584.509 320,-570.491 320,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge5" class="edge"><title>VMs:10034:s&#45;&gt;LinuxBridge:tap4441e3a6_f2:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M408,-656C408,-586.222 408,-568.778 408,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge6" class="edge"><title>VMs:1722445:s&#45;&gt;LinuxBridge:tapce3d7b20_1d:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M466,-656C466,-584.96 496,-570.04 496,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge7" class="edge"><title>VMs:10036:s&#45;&gt;LinuxBridge:tapf0841d56_02:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M524,-656C524,-581.3 584,-573.7 584,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge8" class="edge"><title>VMs:10026:s&#45;&gt;LinuxBridge:tapfbb76083_60:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M577,-656C577,-574.672 671,-580.328 671,-499"/>
</g>
<!-- compute_br_int -->
<g id="node4" class="node"><title>compute_br_int</title>
<polygon fill="white" stroke="none" points="40.5,-176 40.5,-292 783.5,-292 783.5,-176 40.5,-176"/>
<polygon fill="white" stroke="none" points="46,-265 46,-287 779,-287 779,-265 46,-265"/>
<text text-anchor="start" x="388" y="-273.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_int</text>
<polygon fill="#b2f379" stroke="none" points="46,-237 46,-260 143,-260 143,-237 46,-237"/>
<polygon fill="none" stroke="black" points="46,-237 46,-260 143,-260 143,-237 46,-237"/>
<text text-anchor="start" x="52.5" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[9] qvoe0d697f2&#45;cb</text>
<polygon fill="#909090" stroke="none" points="148,-237 148,-260 245,-260 245,-237 148,-237"/>
<polygon fill="none" stroke="black" points="148,-237 148,-260 245,-260 245,-237 148,-237"/>
<text text-anchor="start" x="154" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[10] qvobd4f1f72&#45;5f</text>
<polygon fill="#b2f379" stroke="none" points="250,-237 250,-260 353,-260 353,-237 250,-237"/>
<polygon fill="none" stroke="black" points="250,-237 250,-260 353,-260 353,-237 250,-237"/>
<text text-anchor="start" x="256" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[11] qvobd96ca7d&#45;5e</text>
<polygon fill="#909090" stroke="none" points="358,-237 358,-260 459,-260 459,-237 358,-237"/>
<polygon fill="none" stroke="black" points="358,-237 358,-260 459,-260 459,-237 358,-237"/>
<text text-anchor="start" x="364" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[12] qvo4441e3a6&#45;f2</text>
<polygon fill="#909090" stroke="none" points="464,-237 464,-260 567,-260 567,-237 464,-237"/>
<polygon fill="none" stroke="black" points="464,-237 464,-260 567,-260 567,-237 464,-237"/>
<text text-anchor="start" x="470" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[17] qvoce3d7b20&#45;1d</text>
<polygon fill="#909090" stroke="none" points="572,-237 572,-260 673,-260 673,-237 572,-237"/>
<polygon fill="none" stroke="black" points="572,-237 572,-260 673,-260 673,-237 572,-237"/>
<text text-anchor="start" x="578" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[16] qvof0841d56&#45;02</text>
<polygon fill="#909090" stroke="none" points="678,-237 678,-260 779,-260 779,-237 678,-237"/>
<polygon fill="none" stroke="black" points="678,-237 678,-260 779,-260 779,-237 678,-237"/>
<text text-anchor="start" x="684" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[15] qvofbb76083&#45;60</text>
<polygon fill="#909090" stroke="none" points="46,-209 46,-232 143,-232 143,-209 46,-209"/>
<polygon fill="none" stroke="black" points="46,-209 46,-232 143,-232 143,-209 46,-209"/>
<text text-anchor="start" x="68.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#909090" stroke="none" points="148,-209 148,-232 245,-232 245,-209 148,-209"/>
<polygon fill="none" stroke="black" points="148,-209 148,-232 245,-232 245,-209 148,-209"/>
<text text-anchor="start" x="170.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#909090" stroke="none" points="250,-209 250,-232 353,-232 353,-209 250,-209"/>
<polygon fill="none" stroke="black" points="250,-209 250,-232 353,-232 353,-209 250,-209"/>
<text text-anchor="start" x="275.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#909090" stroke="none" points="358,-209 358,-232 459,-232 459,-209 358,-209"/>
<polygon fill="none" stroke="black" points="358,-209 358,-232 459,-232 459,-209 358,-209"/>
<text text-anchor="start" x="382.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#909090" stroke="none" points="464,-209 464,-232 567,-232 567,-209 464,-209"/>
<polygon fill="none" stroke="black" points="464,-209 464,-232 567,-232 567,-209 464,-209"/>
<text text-anchor="start" x="489.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:4</text>
<polygon fill="#909090" stroke="none" points="572,-209 572,-232 673,-232 673,-209 572,-209"/>
<polygon fill="none" stroke="black" points="572,-209 572,-232 673,-232 673,-209 572,-209"/>
<text text-anchor="start" x="596.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#909090" stroke="none" points="678,-209 678,-232 779,-232 779,-209 678,-209"/>
<polygon fill="none" stroke="black" points="678,-209 678,-232 779,-232 779,-209 678,-209"/>
<text text-anchor="start" x="702.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#909090" stroke="none" points="46,-181 46,-204 779,-204 779,-181 46,-181"/>
<polygon fill="none" stroke="black" points="46,-181 46,-204 779,-204 779,-181 46,-181"/>
<text text-anchor="start" x="385" y="-190" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;tun</text>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge9" class="edge"><title>LinuxBridge:qvbe0d697f2_cb:s&#45;&gt;compute_br_int:qvoe0d697f2_cb:n</title>
<path fill="none" stroke="#009900" stroke-width="4" d="M149,-418C149,-344.064 94,-334.936 94,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge10" class="edge"><title>LinuxBridge:qvbbd4f1f72_5f:s&#45;&gt;compute_br_int:qvobd4f1f72_5f:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M234,-418C234,-346.207 196,-332.793 196,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge11" class="edge"><title>LinuxBridge:qvbbd96ca7d_5e:s&#45;&gt;compute_br_int:qvobd96ca7d_5e:n</title>
<path fill="none" stroke="#009900" stroke-width="4" d="M320,-418C320,-347.713 301,-331.287 301,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge12" class="edge"><title>LinuxBridge:qvb4441e3a6_f2:s&#45;&gt;compute_br_int:qvo4441e3a6_f2:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M408,-418C408,-348.222 408,-330.778 408,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge13" class="edge"><title>LinuxBridge:qvbce3d7b20_1d:s&#45;&gt;compute_br_int:qvoce3d7b20_1d:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M496,-418C496,-347.658 516,-331.342 516,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge14" class="edge"><title>LinuxBridge:qvbf0841d56_02:s&#45;&gt;compute_br_int:qvof0841d56_02:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M584,-418C584,-346.102 623,-332.898 623,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge15" class="edge"><title>LinuxBridge:qvbfbb76083_60:s&#45;&gt;compute_br_int:qvofbb76083_60:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M671,-418C671,-343.613 729,-335.387 729,-261"/>
</g>
<!-- compute_br_tun -->
<g id="node5" class="node"><title>compute_br_tun</title>
<polygon fill="white" stroke="none" points="359.5,-36 359.5,-96 464.5,-96 464.5,-36 359.5,-36"/>
<polygon fill="white" stroke="none" points="365,-69 365,-91 460,-91 460,-69 365,-69"/>
<text text-anchor="start" x="386.5" y="-77.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_tun</text>
<polygon fill="#909090" stroke="none" points="365,-41 365,-64 460,-64 460,-41 365,-41"/>
<polygon fill="none" stroke="black" points="365,-41 365,-64 460,-64 460,-41 365,-41"/>
<text text-anchor="start" x="386.5" y="-50" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;int</text>
</g>
<!-- compute_br_int&#45;&gt;compute_br_tun -->
<g id="edge16" class="edge"><title>compute_br_int:patch_tun:s&#45;&gt;compute_br_tun:patch_int:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M413,-180C413,-128.889 413,-116.111 413,-65"/>
</g>
<!-- NetworkNode -->
<g id="node6" class="node"><title>NetworkNode</title>
<polygon fill="red" stroke="none" points="1164.5,-848 1164.5,-880 1249.5,-880 1249.5,-848 1164.5,-848"/>
<polygon fill="yellow" stroke="none" points="1170,-853 1170,-875 1245,-875 1245,-853 1170,-853"/>
<text text-anchor="start" x="1175.5" y="-861.5" font-family="Helvetica,sans-Serif" font-size="10.00">Network Node</text>
</g>
<!-- br_ex -->
<g id="node7" class="node"><title>br_ex</title>
<polygon fill="white" stroke="none" points="1104,-652 1104,-768 1310,-768 1310,-652 1104,-652"/>
<polygon fill="white" stroke="none" points="1109,-741 1109,-763 1305,-763 1305,-741 1109,-741"/>
<text text-anchor="start" x="1182.5" y="-749.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_ex</text>
<polygon fill="#909090" stroke="none" points="1109,-713 1109,-736 1204,-736 1204,-713 1109,-713"/>
<polygon fill="none" stroke="black" points="1109,-713 1109,-736 1204,-736 1204,-713 1109,-713"/>
<text text-anchor="start" x="1141" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">router1</text>
<polygon fill="#909090" stroke="none" points="1209,-713 1209,-736 1305,-736 1305,-713 1209,-713"/>
<polygon fill="none" stroke="black" points="1209,-713 1209,-736 1305,-736 1305,-713 1209,-713"/>
<text text-anchor="start" x="1241.5" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">router2</text>
<polygon fill="#909090" stroke="none" points="1109,-685 1109,-708 1204,-708 1204,-685 1109,-685"/>
<polygon fill="none" stroke="black" points="1109,-685 1109,-708 1204,-708 1204,-685 1109,-685"/>
<text text-anchor="start" x="1126.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">172.24.4.3/24</text>
<polygon fill="#909090" stroke="none" points="1209,-685 1209,-708 1305,-708 1305,-685 1209,-685"/>
<polygon fill="none" stroke="black" points="1209,-685 1209,-708 1305,-708 1305,-685 1209,-685"/>
<text text-anchor="start" x="1227" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">172.24.4.4/24</text>
<polygon fill="#909090" stroke="none" points="1109,-657 1109,-680 1204,-680 1204,-657 1109,-657"/>
<polygon fill="none" stroke="black" points="1109,-657 1109,-680 1204,-680 1204,-657 1109,-657"/>
<text text-anchor="start" x="1115.5" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">[2] qg&#45;eb8796fb&#45;83</text>
<polygon fill="#909090" stroke="none" points="1209,-657 1209,-680 1305,-680 1305,-657 1209,-657"/>
<polygon fill="none" stroke="black" points="1209,-657 1209,-680 1305,-680 1305,-657 1209,-657"/>
<text text-anchor="start" x="1215" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">[3] qg&#45;e2b1b0d3&#45;a8</text>
</g>
<!-- NetworkNode&#45;&gt;br_ex -->
<!-- network_br_int -->
<g id="node8" class="node"><title>network_br_int</title>
<polygon fill="white" stroke="none" points="856,-372 856,-572 1662,-572 1662,-372 856,-372"/>
<polygon fill="white" stroke="none" points="861,-545 861,-567 1657,-567 1657,-545 861,-545"/>
<text text-anchor="start" x="1234.5" y="-553.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_int</text>
<polygon fill="#b2f379" stroke="none" points="861,-517 861,-540 956,-540 956,-517 861,-517"/>
<polygon fill="none" stroke="black" points="861,-517 861,-540 956,-540 956,-517 861,-517"/>
<text text-anchor="start" x="867.5" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[8] qr&#45;09a15e37&#45;ca</text>
<polygon fill="#909090" stroke="none" points="961,-517 961,-540 1055,-540 1055,-517 961,-517"/>
<polygon fill="none" stroke="black" points="961,-517 961,-540 1055,-540 1055,-517 961,-517"/>
<text text-anchor="start" x="967" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[6] tapd0828ef0&#45;eb</text>
<polygon fill="#b2f379" stroke="none" points="1060,-517 1060,-540 1154,-540 1154,-517 1060,-517"/>
<polygon fill="none" stroke="black" points="1060,-517 1060,-540 1154,-540 1154,-517 1060,-517"/>
<text text-anchor="start" x="1066" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[7] qr&#45;622abba5&#45;e2</text>
<polygon fill="#909090" stroke="none" points="1159,-517 1159,-540 1253,-540 1253,-517 1159,-517"/>
<polygon fill="none" stroke="black" points="1159,-517 1159,-540 1253,-540 1253,-517 1159,-517"/>
<text text-anchor="start" x="1165" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[5] tapd6f091a2&#45;c0</text>
<polygon fill="#909090" stroke="none" points="1258,-517 1258,-540 1355,-540 1355,-517 1258,-517"/>
<polygon fill="none" stroke="black" points="1258,-517 1258,-540 1355,-540 1355,-517 1258,-517"/>
<text text-anchor="start" x="1264" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[13] qr&#45;361be2af&#45;e5</text>
<polygon fill="#909090" stroke="none" points="1360,-517 1360,-540 1454,-540 1454,-517 1360,-517"/>
<polygon fill="none" stroke="black" points="1360,-517 1360,-540 1454,-540 1454,-517 1360,-517"/>
<text text-anchor="start" x="1366" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[5] tapd6f091a2&#45;c0</text>
<polygon fill="#909090" stroke="none" points="1459,-517 1459,-540 1558,-540 1558,-517 1459,-517"/>
<polygon fill="none" stroke="black" points="1459,-517 1459,-540 1558,-540 1558,-517 1459,-517"/>
<text text-anchor="start" x="1465" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[14] qr&#45;b66b902a&#45;36</text>
<polygon fill="#909090" stroke="none" points="1563,-517 1563,-540 1657,-540 1657,-517 1563,-517"/>
<polygon fill="none" stroke="black" points="1563,-517 1563,-540 1657,-540 1657,-517 1563,-517"/>
<text text-anchor="start" x="1569" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[6] tapd0828ef0&#45;eb</text>
<polygon fill="#909090" stroke="none" points="861,-489 861,-512 956,-512 956,-489 861,-489"/>
<polygon fill="none" stroke="black" points="861,-489 861,-512 956,-512 956,-489 861,-489"/>
<text text-anchor="start" x="882.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#909090" stroke="none" points="961,-489 961,-512 1055,-512 1055,-489 961,-489"/>
<polygon fill="none" stroke="black" points="961,-489 961,-512 1055,-512 1055,-489 961,-489"/>
<text text-anchor="start" x="982" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#909090" stroke="none" points="1060,-489 1060,-512 1154,-512 1154,-489 1060,-489"/>
<polygon fill="none" stroke="black" points="1060,-489 1060,-512 1154,-512 1154,-489 1060,-489"/>
<text text-anchor="start" x="1081" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#909090" stroke="none" points="1159,-489 1159,-512 1253,-512 1253,-489 1159,-489"/>
<polygon fill="none" stroke="black" points="1159,-489 1159,-512 1253,-512 1253,-489 1159,-489"/>
<text text-anchor="start" x="1180" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#909090" stroke="none" points="1258,-489 1258,-512 1355,-512 1355,-489 1258,-489"/>
<polygon fill="none" stroke="black" points="1258,-489 1258,-512 1355,-512 1355,-489 1258,-489"/>
<text text-anchor="start" x="1280.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#909090" stroke="none" points="1360,-489 1360,-512 1454,-512 1454,-489 1360,-489"/>
<polygon fill="none" stroke="black" points="1360,-489 1360,-512 1454,-512 1454,-489 1360,-489"/>
<text text-anchor="start" x="1381" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#909090" stroke="none" points="1459,-489 1459,-512 1558,-512 1558,-489 1459,-489"/>
<polygon fill="none" stroke="black" points="1459,-489 1459,-512 1558,-512 1558,-489 1459,-489"/>
<text text-anchor="start" x="1482.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#909090" stroke="none" points="1563,-489 1563,-512 1657,-512 1657,-489 1563,-489"/>
<polygon fill="none" stroke="black" points="1563,-489 1563,-512 1657,-512 1657,-489 1563,-489"/>
<text text-anchor="start" x="1584" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#909090" stroke="none" points="861,-461 861,-484 956,-484 956,-461 861,-461"/>
<polygon fill="none" stroke="black" points="861,-461 861,-484 956,-484 956,-461 861,-461"/>
<text text-anchor="start" x="884" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.1/24</text>
<polygon fill="#909090" stroke="none" points="961,-461 961,-484 1055,-484 1055,-461 961,-461"/>
<polygon fill="none" stroke="black" points="961,-461 961,-484 1055,-484 1055,-461 961,-461"/>
<text text-anchor="start" x="983.5" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.2/24</text>
<polygon fill="#909090" stroke="none" points="1060,-461 1060,-484 1154,-484 1154,-461 1060,-461"/>
<polygon fill="none" stroke="black" points="1060,-461 1060,-484 1154,-484 1154,-461 1060,-461"/>
<text text-anchor="start" x="1082.5" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.1/24</text>
<polygon fill="#909090" stroke="none" points="1159,-461 1159,-484 1253,-484 1253,-461 1159,-461"/>
<polygon fill="none" stroke="black" points="1159,-461 1159,-484 1253,-484 1253,-461 1159,-461"/>
<text text-anchor="start" x="1181.5" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.2/24</text>
<polygon fill="#909090" stroke="none" points="1258,-461 1258,-484 1355,-484 1355,-461 1258,-461"/>
<polygon fill="none" stroke="black" points="1258,-461 1258,-484 1355,-484 1355,-461 1258,-461"/>
<text text-anchor="start" x="1282" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.5/24</text>
<polygon fill="#909090" stroke="none" points="1360,-461 1360,-484 1454,-484 1454,-461 1360,-461"/>
<polygon fill="none" stroke="black" points="1360,-461 1360,-484 1454,-484 1454,-461 1360,-461"/>
<text text-anchor="start" x="1382.5" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.2/24</text>
<polygon fill="#909090" stroke="none" points="1459,-461 1459,-484 1558,-484 1558,-461 1459,-461"/>
<polygon fill="none" stroke="black" points="1459,-461 1459,-484 1558,-484 1558,-461 1459,-461"/>
<text text-anchor="start" x="1484" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.5/24</text>
<polygon fill="#909090" stroke="none" points="1563,-461 1563,-484 1657,-484 1657,-461 1563,-461"/>
<polygon fill="none" stroke="black" points="1563,-461 1563,-484 1657,-484 1657,-461 1563,-461"/>
<text text-anchor="start" x="1585.5" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.2/24</text>
<polygon fill="#909090" stroke="none" points="861,-433 861,-456 1055,-456 1055,-433 861,-433"/>
<polygon fill="none" stroke="black" points="861,-433 861,-456 1055,-456 1055,-433 861,-433"/>
<text text-anchor="start" x="940.5" y="-442" font-family="Helvetica,sans-Serif" font-size="10.00">private2</text>
<polygon fill="#909090" stroke="none" points="1060,-433 1060,-456 1253,-456 1253,-433 1060,-433"/>
<polygon fill="none" stroke="black" points="1060,-433 1060,-456 1253,-456 1253,-433 1060,-433"/>
<text text-anchor="start" x="1139" y="-442" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#909090" stroke="none" points="1258,-433 1258,-456 1454,-456 1454,-433 1258,-433"/>
<polygon fill="none" stroke="black" points="1258,-433 1258,-456 1454,-456 1454,-433 1258,-433"/>
<text text-anchor="start" x="1338.5" y="-442" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#909090" stroke="none" points="1459,-433 1459,-456 1657,-456 1657,-433 1459,-433"/>
<polygon fill="none" stroke="black" points="1459,-433 1459,-456 1657,-456 1657,-433 1459,-433"/>
<text text-anchor="start" x="1540.5" y="-442" font-family="Helvetica,sans-Serif" font-size="10.00">private2</text>
<polygon fill="#909090" stroke="none" points="861,-405 861,-428 1253,-428 1253,-405 861,-405"/>
<polygon fill="none" stroke="black" points="861,-405 861,-428 1253,-428 1253,-405 861,-405"/>
<text text-anchor="start" x="1041.5" y="-414" font-family="Helvetica,sans-Serif" font-size="10.00">router1</text>
<polygon fill="#909090" stroke="none" points="1258,-405 1258,-428 1657,-428 1657,-405 1258,-405"/>
<polygon fill="none" stroke="black" points="1258,-405 1258,-428 1657,-428 1657,-405 1258,-405"/>
<text text-anchor="start" x="1442" y="-414" font-family="Helvetica,sans-Serif" font-size="10.00">router2</text>
<polygon fill="#909090" stroke="none" points="861,-377 861,-400 1657,-400 1657,-377 861,-377"/>
<polygon fill="none" stroke="black" points="861,-377 861,-400 1657,-400 1657,-377 861,-377"/>
<text text-anchor="start" x="1231.5" y="-386" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;tun</text>
</g>
<!-- br_ex&#45;&gt;network_br_int -->
<g id="edge19" class="edge"><title>br_ex:qg_e2b1b0d3_a8:s&#45;&gt;network_br_int:qr_361be2af_e5:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M1257,-656C1257,-600.267 1307,-596.733 1307,-541"/>
</g>
<!-- br_ex&#45;&gt;network_br_int -->
<g id="edge20" class="edge"><title>br_ex:qg_e2b1b0d3_a8:s&#45;&gt;network_br_int:qr_b66b902a_36:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M1257,-656C1257,-532.889 1509,-664.111 1509,-541"/>
</g>
<!-- br_ex&#45;&gt;network_br_int -->
<g id="edge21" class="edge"><title>br_ex:qg_eb8796fb_83:s&#45;&gt;network_br_int:qr_09a15e37_ca:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M1156,-656C1156,-534.504 908,-662.496 908,-541"/>
</g>
<!-- br_ex&#45;&gt;network_br_int -->
<g id="edge22" class="edge"><title>br_ex:qg_eb8796fb_83:s&#45;&gt;network_br_int:qr_622abba5_e2:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M1156,-656C1156,-600.443 1107,-596.557 1107,-541"/>
</g>
<!-- network_br_tun -->
<g id="node9" class="node"><title>network_br_tun</title>
<polygon fill="white" stroke="none" points="1205.5,-204 1205.5,-264 1310.5,-264 1310.5,-204 1205.5,-204"/>
<polygon fill="white" stroke="none" points="1211,-237 1211,-259 1306,-259 1306,-237 1211,-237"/>
<text text-anchor="start" x="1232.5" y="-245.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_tun</text>
<polygon fill="#909090" stroke="none" points="1211,-209 1211,-232 1306,-232 1306,-209 1211,-209"/>
<polygon fill="none" stroke="black" points="1211,-209 1211,-232 1306,-232 1306,-209 1211,-209"/>
<text text-anchor="start" x="1232.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;int</text>
</g>
<!-- network_br_int&#45;&gt;network_br_tun -->
<g id="edge18" class="edge"><title>network_br_int:patch_tun:s&#45;&gt;network_br_tun:patch_int:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M1259,-376C1259,-312.444 1259,-296.556 1259,-233"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 40 KiB

View File

@ -0,0 +1,31 @@
<!DOCTYPE html>
<html>
<head>
<title>DON: Internal View</title>
<link rel="stylesheet" type="text/css" href="don.css">
</head>
<body>
<div id="internal">
<table width="100%">
<th class="title">
DON: Internal View
</th>
<tr>
<td align="center" class="clickme">
<button class="myButton"
onClick="location.href='http://127.0.0.1:8000/don/analyze'">
Analyze</button>
&nbsp;&nbsp;&nbsp;
<button class="myButton"
onClick="location.href='http://127.0.0.1:8000/don/ping'">
Ping Tracer</button>
</td>
</tr>
<tr>
<td><object class="emb" data="don.svg" width="100%" height="850" type="image/svg+xml" id="don_svg"></object></td>
</tr>
</table>
</div>
</body>
</html>

View File

@ -0,0 +1,15 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "DON" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("Diagnosing OpenVswitch") %}
{% endblock page_header %}
{% block main %}
<!-- <ng-include src="'{{ STATIC_URL }}dashboard/don/ovs/view.html'"></ng-include> -->
{% include "don/don.report.html" %}
{% endblock %}

View File

@ -0,0 +1,15 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "DON" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("Diagnosing OpenVswitch") %}
{% endblock page_header %}
{% block main %}
<!-- <ng-include src="'{{ STATIC_URL }}dashboard/mydashboard/mypanel/mypanel.html'"></ng-include> -->
{% include "don/don.html" %}
{% endblock %}

View File

@ -0,0 +1,15 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "DON" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("Diagnosing OpenVswitch") %}
{% endblock page_header %}
{% block main %}
<!-- <ng-include src="'{{ STATIC_URL }}dashboard/don/ovs/view.html'"></ng-include> -->
{% include "don/path.html" %}
{% endblock %}

View File

@ -0,0 +1,15 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "DON" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("Diagnosing OpenVswitch") %}
{% endblock page_header %}
{% block main %}
<!-- <ng-include src="'{{ STATIC_URL }}dashboard/don/ovs/view.html'"></ng-include> -->
{% include "don/ping.html" %}
{% endblock %}

View File

@ -0,0 +1,15 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "DON" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("Diagnosing OpenVswitch") %}
{% endblock page_header %}
{% block main %}
<!-- <ng-include src="'{{ STATIC_URL }}dashboard/don/ovs/view.html'"></ng-include> -->
{% include "don/view.html" %}
{% endblock %}

View File

@ -0,0 +1,18 @@
from django.conf.urls import patterns
from django.conf.urls import url
from don.ovs.views \
import IndexView
from . import views
urlpatterns = patterns(
'',
url(r'^view/', views.view, name='view'),
url(r'^collect/', views.collect, name='collect'),
url(r'^ping/', views.ping, name='ping'),
url(r'^analyze/', views.analyze, name='analyze'),
url(r'^status/', views.get_status, name='get_status'),
url(r'^$', IndexView.as_view(), name='index'),
)

View File

@ -0,0 +1,233 @@
from horizon import views
from django.http import HttpResponse
from django.conf import settings
from plot import DotGenerator
import os
import subprocess
from .forms import PingForm
# from django.shortcuts import render_to_response
from horizon import messages
import analyzer
import path
from common import execute_cmd, get_instance_ips, get_env, get_router_names
import json
import shlex
from django.shortcuts import render
class IndexView(views.APIView):
# A very simple class-based view...
template_name = 'don/ovs/index.html'
def get_data(self, request, context, *args, **kwargs):
# Add data to the context here...
return context
def index(request):
return HttpResponse('I am DON')
def view(request):
# import pdb
# pdb.set_trace()
pwd = settings.ROOT_PATH # +'/openstack_dashboard/dashboards/admin/don/'
JSON_FILE = pwd + '/don/ovs/don.json'
static_path = settings.STATIC_ROOT
'''
COMPUTE_DOT_FILE = pwd + '/don/ovs/static/compute.dot'
COMPUTE_SVG_FILE = pwd + '/don/ovs/static/compute.svg'
NETWORK_DOT_FILE = pwd + '/don/ovs/static/network.dot'
NETWORK_SVG_FILE = pwd + '/don/ovs/static/network.svg'
COMBINED_DOT_FILE = pwd + '/don/ovs/static/don.dot'
COMBINED_SVG_FILE = pwd + '/don/ovs/static/don.svg'
'''
COMPUTE_DOT_FILE = static_path + '/don/compute.dot'
COMPUTE_SVG_FILE = static_path + '/don/compute.svg'
NETWORK_DOT_FILE = static_path + '/don/network.dot'
NETWORK_SVG_FILE = static_path + '/don/network.svg'
COMBINED_DOT_FILE = static_path + '/don/don.dot'
COMBINED_SVG_FILE = static_path + '/don/don.svg'
macro = {}
# return HttpResponseRedirect('static/view.html')
plotter = DotGenerator(JSON_FILE,
COMPUTE_DOT_FILE,
COMPUTE_SVG_FILE,
NETWORK_DOT_FILE,
NETWORK_SVG_FILE,
COMBINED_DOT_FILE,
COMBINED_SVG_FILE,
None
)
plotter.plot_compute_node()
plotter.generate_compute_svg()
plotter.plot_network_node()
plotter.generate_network_svg()
plotter.plot_combined()
plotter.generate_combined_svg()
# return HttpResponseRedirect('static/view.html')
return render(request, "don/ovs/views.html", macro)
def analyze(request):
# pwd = settings.BASE_DIR
pwd = settings.ROOT_PATH
JSON_FILE = pwd + '/don/ovs/don.json'
params = {
'error_file': pwd + '/don/templates/don/don.error.txt',
'test:all': True,
'test:ping': False,
'test:ping_count': 1,
'test:ovs': True,
'test:report_file': pwd + '/don/templates/don/don.report.html',
}
print "params ====> ", params
analyzer.analyze(JSON_FILE, params)
# output = analyzer.analyze(JSON_FILE, params)
# html = '<html><body>Output: %s</body></html>' % output
# return HttpResponse(html)
# return HttpResponseRedirect('/static/don.report.html')
return render(request, "don/ovs/analyze.html")
# return render_to_response('don/ovs/analyze.html')
def test(request):
return HttpResponse('Testing the setup')
def ping(request):
# if this is a POST request we need to process the form data
if request.method == 'POST':
# create a form instance and populate it with data from the request:
form = PingForm(request.POST)
# check whether it's valid:
if form.is_valid():
# process the data in form.cleaned_data as required
# ...
# redirect to a new URL:
src_ip = form.cleaned_data['src_ip']
dst_ip = form.cleaned_data['dst_ip']
router = form.cleaned_data['router']
# html = '<html><body>SIP: %s DIP: %s router: %s</body></html>' % (src_ip, dst_ip, router)
# return HttpResponse(html)
static_path = settings.STATIC_ROOT
pwd = settings.ROOT_PATH
JSON_FILE = pwd + '/don/ovs/don.json'
params = {
'json_file': pwd + '/don/ovs/don.json',
'src_ip': src_ip,
'dst_ip': dst_ip,
'router': router,
'path_file': static_path + '/don/ping.html',
'username': 'cirros',
'passwd': 'cubswin:)',
'count': 2,
'timeout': 2,
'debug': True,
'plot': False,
}
response = path.path(params)
if response:
error_text = response
messages.error(request, error_text)
return render(request, 'don/ovs/ping.html', {'form': form})
JSON_FILE = pwd + '/don/ovs/don.json'
COMPUTE_DOT_FILE = None
COMPUTE_SVG_FILE = None
NETWORK_DOT_FILE = None
NETWORK_SVG_FILE = None
COMBINED_DOT_FILE = static_path + '/don/ping.dot'
COMBINED_SVG_FILE = static_path + '/don/ping.svg'
# HIGHLIGHT_FILE = pwd + '/don/ovs/static/ping.html'
HIGHLIGHT_FILE = static_path + '/don/ping.html'
plotter = DotGenerator(JSON_FILE,
COMPUTE_DOT_FILE,
COMPUTE_SVG_FILE,
NETWORK_DOT_FILE,
NETWORK_SVG_FILE,
COMBINED_DOT_FILE,
COMBINED_SVG_FILE,
HIGHLIGHT_FILE,
)
plotter.plot_combined()
plotter.generate_combined_svg()
# return HttpResponseRedirect('/static/path.html')
return render(request, 'don/ovs/path.html')
# if a GET (or any other method) we'll create a blank form
else:
form = PingForm()
BASE_DIR = settings.ROOT_PATH + '/don/ovs/'
myenv = os.environ.copy()
myenv.update(get_env(BASE_DIR + 'admin-openrc.sh'))
output = execute_cmd(['nova', 'list'], sudo=False,
shell=False, env=myenv).split('\n')
ip_list = get_instance_ips(output)
ip_list.sort()
router_op = execute_cmd(
['neutron', 'router-list'], sudo=False, shell=False, env=myenv).split('\n')
router_list = get_router_names(router_op)
router_list.sort()
# insert first value of select menu
ip_opt = zip(ip_list, ip_list)
router_opt = zip(router_list, router_list)
# ip_opt.insert(0,('','Select IP address'))
# router_opt.insert(0,('','Select Router'))
form.fields['src_ip'].widget.choices = ip_opt
form.fields['dst_ip'].widget.choices = ip_opt
form.fields['router'].widget.choices = router_opt
return render(request, 'don/ovs/ping.html', {'form': form})
def collect(request):
macro = {'collect_status': 'Collection failed'}
status = 0
BASE_DIR = settings.ROOT_PATH
# CUR_DIR = os.getcwd()
os.chdir(BASE_DIR + '/don/ovs')
cmd = 'sudo python collector.py'
for line in run_command(cmd):
if line.startswith('STATUS:') and line.find('Writing collected info') != -1:
status = 1
macro['collect_status'] = \
"Collecton successful. Click visualize to display"
# res = collector.main()
os.chdir(BASE_DIR)
if status:
messages.success(request, macro['collect_status'])
else:
messages.error(request, macro['collect_status'])
resp = HttpResponse(json.dumps(macro), content_type="application/json")
return resp
def run_command(cmd):
ps = subprocess.Popen(shlex.split(
cmd), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while(True):
ret = ps.poll() # returns None while subprocess is running
line = ps.stdout.readline()
yield line
if(ret is not None):
break
def get_status(request):
BASE_DIR = settings.ROOT_PATH + '/don/ovs/'
status = open(BASE_DIR + 'collector_log.txt', 'r').readline()
if status != " " and status != '\n':
return HttpResponse(json.dumps({'status': status}), content_type="application/json")

View File

@ -0,0 +1,31 @@
<!DOCTYPE html>
<html>
<head>
<title>DON: Internal View</title>
<link rel="stylesheet" type="text/css" href="don.css">
</head>
<body>
<div id="internal">
<table width="100%">
<th class="title">
DON: Internal View
</th>
<tr>
<td align="center" class="clickme">
<button class="myButton"
onClick="location.href='http://127.0.0.1:8000/don/analyze'">
Analyze</button>
&nbsp;&nbsp;&nbsp;
<button class="myButton"
onClick="location.href='http://127.0.0.1:8000/don/ping'">
Ping Tracer</button>
</td>
</tr>
<tr>
<td><object class="emb" data="don.svg" width="100%" height="850" type="image/svg+xml" id="don_svg"></object></td>
</tr>
</table>
</div>
</body>
</html>

View File

@ -0,0 +1,21 @@
digraph DON_compute {
graph [fontsize=10 fontname="Helvetica"];
node [fontsize=10 fontname="Helvetica"];
rankdir = TB;
ranksep = 1;
concentrate = true;
compound = true;
edge [dir=none]
subgraph cluster_ComputeNode {
ComputeNode [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="red">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="yellow" PORT="ComputeNode">Compute Node</TD>
</TR>
</TABLE>>];
}
subgraph cluster_Nova {
style=filled

View File

@ -0,0 +1,111 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.36.0 (20140111.2315)
-->
<!-- Title: DON_compute Pages: 1 -->
<svg width="365pt" height="620pt"
viewBox="0.00 0.00 365.00 620.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 616)">
<title>DON_compute</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-616 361,-616 361,4 -4,4"/>
<g id="clust1" class="cluster"><title>cluster_ComputeNode</title>
<polygon fill="none" stroke="black" points="204,-548 204,-604 324,-604 324,-548 204,-548"/>
</g>
<g id="clust2" class="cluster"><title>cluster_Nova</title>
<polygon fill="lightgrey" stroke="black" points="87,-344 87,-500 349,-500 349,-344 87,-344"/>
</g>
<g id="clust3" class="cluster"><title>cluster_VMs</title>
<polygon fill="lightgrey" stroke="black" points="187,-352 187,-492 341,-492 341,-352 187,-352"/>
</g>
<g id="clust4" class="cluster"><title>cluster_LinuxBridge</title>
<polygon fill="lightgrey" stroke="black" points="95,-396 95,-448 179,-448 179,-396 95,-396"/>
</g>
<g id="clust5" class="cluster"><title>cluster_OVS</title>
<polygon fill="lightgrey" stroke="black" points="8,-8 8,-304 266,-304 266,-8 8,-8"/>
</g>
<g id="clust6" class="cluster"><title>cluster_compute_br_int</title>
<polygon fill="lightgrey" stroke="black" points="16,-156 16,-296 258,-296 258,-156 16,-156"/>
</g>
<g id="clust7" class="cluster"><title>cluster_compute_br_tun</title>
<polygon fill="lightgrey" stroke="black" points="81,-16 81,-100 193,-100 193,-16 81,-16"/>
</g>
<!-- ComputeNode -->
<g id="node1" class="node"><title>ComputeNode</title>
<polygon fill="red" stroke="none" points="220,-560 220,-592 308,-592 308,-560 220,-560"/>
<polygon fill="yellow" stroke="none" points="225,-565 225,-587 303,-587 303,-565 225,-565"/>
<text text-anchor="start" x="230.5" y="-573.5" font-family="Helvetica,sans-Serif" font-size="10.00">Compute Node</text>
</g>
<!-- VMs -->
<g id="node2" class="node"><title>VMs</title>
<polygon fill="white" stroke="none" points="203,-364 203,-480 325,-480 325,-364 203,-364"/>
<polygon fill="white" stroke="none" points="208,-453 208,-475 320,-475 320,-453 208,-453"/>
<text text-anchor="start" x="253.5" y="-461.5" font-family="Helvetica,sans-Serif" font-size="10.00">VMs</text>
<polygon fill="#ff9933" stroke="none" points="208,-425 208,-448 262,-448 262,-425 208,-425"/>
<polygon fill="none" stroke="black" points="208,-425 208,-448 262,-448 262,-425 208,-425"/>
<text text-anchor="start" x="225.5" y="-434" font-family="Helvetica,sans-Serif" font-size="10.00">vm1</text>
<polygon fill="#ff9933" stroke="none" points="267,-425 267,-448 320,-448 320,-425 267,-425"/>
<polygon fill="none" stroke="black" points="267,-425 267,-448 320,-448 320,-425 267,-425"/>
<text text-anchor="start" x="284" y="-434" font-family="Helvetica,sans-Serif" font-size="10.00">vm2</text>
<polygon fill="#c079f3" stroke="none" points="208,-397 208,-420 262,-420 262,-397 208,-397"/>
<polygon fill="none" stroke="black" points="208,-397 208,-420 262,-420 262,-397 208,-397"/>
<text text-anchor="start" x="217.5" y="-406" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#c079f3" stroke="none" points="267,-397 267,-420 320,-420 320,-397 267,-397"/>
<polygon fill="none" stroke="black" points="267,-397 267,-420 320,-420 320,-397 267,-397"/>
<text text-anchor="start" x="276" y="-406" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#c079f3" stroke="none" points="208,-369 208,-392 262,-392 262,-369 208,-369"/>
<polygon fill="none" stroke="black" points="208,-369 208,-392 262,-392 262,-369 208,-369"/>
<text text-anchor="start" x="214.5" y="-378" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.3</text>
<polygon fill="#c079f3" stroke="none" points="267,-369 267,-392 320,-392 320,-369 267,-369"/>
<polygon fill="none" stroke="black" points="267,-369 267,-392 320,-392 320,-369 267,-369"/>
<text text-anchor="start" x="273" y="-378" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.4</text>
</g>
<!-- ComputeNode&#45;&gt;VMs -->
<!-- LinuxBridge -->
<g id="node3" class="node"><title>LinuxBridge</title>
<text text-anchor="middle" x="137" y="-419.5" font-family="Helvetica,sans-Serif" font-size="10.00">LinuxBridge</text>
</g>
<!-- compute_br_int -->
<g id="node4" class="node"><title>compute_br_int</title>
<polygon fill="white" stroke="none" points="32,-168 32,-284 242,-284 242,-168 32,-168"/>
<polygon fill="white" stroke="none" points="37,-257 37,-279 237,-279 237,-257 37,-257"/>
<text text-anchor="start" x="112.5" y="-265.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_int</text>
<polygon fill="#c079f3" stroke="none" points="37,-229 37,-252 136,-252 136,-229 37,-229"/>
<polygon fill="none" stroke="black" points="37,-229 37,-252 136,-252 136,-229 37,-229"/>
<text text-anchor="start" x="43.5" y="-238" font-family="Helvetica,sans-Serif" font-size="10.00">[6] qvo8aa60600&#45;7b</text>
<polygon fill="#c079f3" stroke="none" points="141,-229 141,-252 237,-252 237,-229 141,-229"/>
<polygon fill="none" stroke="black" points="141,-229 141,-252 237,-252 237,-229 141,-229"/>
<text text-anchor="start" x="147" y="-238" font-family="Helvetica,sans-Serif" font-size="10.00">[7] qvo71ac5bef&#45;7c</text>
<polygon fill="#c079f3" stroke="none" points="37,-201 37,-224 136,-224 136,-201 37,-201"/>
<polygon fill="none" stroke="black" points="37,-201 37,-224 136,-224 136,-201 37,-201"/>
<text text-anchor="start" x="60.5" y="-210" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="141,-201 141,-224 237,-224 237,-201 141,-201"/>
<polygon fill="none" stroke="black" points="141,-201 141,-224 237,-224 237,-201 141,-201"/>
<text text-anchor="start" x="163" y="-210" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#ffcc00" stroke="none" points="37,-173 37,-196 237,-196 237,-173 37,-173"/>
<polygon fill="none" stroke="black" points="37,-173 37,-196 237,-196 237,-173 37,-173"/>
<text text-anchor="start" x="109.5" y="-182" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;tun</text>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge2" class="edge"><title>LinuxBridge:qvb8aa60600_7b:s&#45;&gt;compute_br_int:qvo8aa60600_7b:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M128.116,-403.866C113.505,-374.046 86,-310.304 86,-253"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge3" class="edge"><title>LinuxBridge:qvb71ac5bef_7c:s&#45;&gt;compute_br_int:qvo71ac5bef_7c:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M146.058,-403.886C160.956,-374.097 189,-310.4 189,-253"/>
</g>
<!-- compute_br_tun -->
<g id="node5" class="node"><title>compute_br_tun</title>
<polygon fill="white" stroke="none" points="97,-28 97,-88 177,-88 177,-28 97,-28"/>
<polygon fill="white" stroke="none" points="102,-61 102,-83 172,-83 172,-61 102,-61"/>
<text text-anchor="start" x="111" y="-69.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_tun</text>
<polygon fill="#ffcc00" stroke="none" points="102,-33 102,-56 172,-56 172,-33 102,-33"/>
<polygon fill="none" stroke="black" points="102,-33 102,-56 172,-56 172,-33 102,-33"/>
<text text-anchor="start" x="111" y="-42" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;int</text>
</g>
<!-- compute_br_int&#45;&gt;compute_br_tun -->
<g id="edge4" class="edge"><title>compute_br_int:patch_tun:s&#45;&gt;compute_br_tun:patch_int:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M137,-172C137,-120.889 137,-108.111 137,-57"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@ -0,0 +1,198 @@
digraph DON_DON {
graph [fontsize=10 fontname="Helvetica"];
node [fontsize=10 fontname="Helvetica"];
rankdir = TB;
ranksep = 1;
concentrate = true;
compound = true;
edge [dir=none]
subgraph cluster_DONComputeNode {
style=filled
subgraph cluster_ComputeNode {
ComputeNode [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="red">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="yellow" PORT="ComputeNode">Compute Node</TD>
</TR>
</TABLE>>];
}
subgraph cluster_Nova {
style=filled
subgraph cluster_VMs {
VMs [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="VMs">VMs</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933">vm1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933">vm2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3">private1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3">private1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="101003">10.10.0.3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="101004">10.10.0.4</TD>
</TR>
</TABLE>>];
}
subgraph cluster_LinuxBridge {
LinuxBridge [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="LinuxBridge">Linux Bridge</TD>
</TR>
<TR>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qbr8aa60600_7b">qbr8aa60600-7b</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qbr71ac5bef_7c">qbr71ac5bef-7c</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvb8aa60600_7b">qvb8aa60600-7b</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvb71ac5bef_7c">qvb71ac5bef-7c</TD>
</TR>
</TABLE>>];
}
}
subgraph cluster_OVS {
style=filled
subgraph cluster_compute_br_int {
compute_br_int [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_int">OVS br_int</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvo8aa60600_7b">[6] qvo8aa60600-7b</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvo71ac5bef_7c">[7] qvo71ac5bef-7c</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvo8aa60600_7btag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvo71ac5bef_7ctag_2">VLAN tag:2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ffcc00" PORT="patch_tun">[1] patch-tun</TD>
</TR>
</TABLE>>];
}
subgraph cluster_compute_br_tun {
compute_br_tun [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_tun">OVS br_tun</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ffcc00" PORT="patch_int">[1] patch-int</TD>
</TR>
</TABLE>>];
}
}
ComputeNode:s -> VMs:n [color = "#0066cc", penwidth = "4", style="invis"]
LinuxBridge:qvb8aa60600_7b:s -> compute_br_int:qvo8aa60600_7b:n [color = "#0066cc", penwidth = "4"]
LinuxBridge:qvb71ac5bef_7c:s -> compute_br_int:qvo71ac5bef_7c:n [color = "#0066cc", penwidth = "4"]
compute_br_int:patch_tun:s -> compute_br_tun:patch_int:n [color = "#0066cc", penwidth = "4"]
}
subgraph cluster_DONNetworkNode {
style=filled
subgraph cluster_NetworkNode {
NetworkNode [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="red">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="yellow" PORT="NetworkNode">Network Node</TD>
</TR>
</TABLE>>];
}
subgraph cluster_OVS {
style=filled
subgraph cluster_br_ex {
br_ex [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="white" PORT="OVSbr_ex">OVS br_ex</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="router1">router1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="172.24.4.3/24">172.24.4.3/24</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="qg_757bf552_73">[2] qg-757bf552-73</TD>
</TR>
</TABLE>>];
}
subgraph cluster_network_br_int {
network_br_int [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_int">OVS br_int</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_43b83157_3b">[8] qr-43b83157-3b</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tap59f90a3b_f5">[5] tap59f90a3b-f5</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_43b83157_3btag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tap59f90a3b_f5tag_2">VLAN tag:2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_43b83157_3b10.10.0.1/24">10.10.0.1/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tap59f90a3b_f510.10.0.2/24">10.10.0.2/24</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#c079f3" PORT="private1">private1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ff9933" PORT="router1">router1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ffcc00" PORT="patch_tun">[1] patch-tun</TD>
</TR>
</TABLE>>];
}
subgraph cluster_network_br_tun {
network_br_tun [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_tun">OVS br_tun</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ffcc00" PORT="patch_int">[1] patch-int</TD>
</TR>
</TABLE>>];
}
}
NetworkNode:s -> br_ex:n [color = "#0066cc", penwidth = "4", style="invis"]
network_br_int:patch_tun:s -> network_br_tun:patch_int:n [color = "#0066cc", penwidth = "4"]
br_ex:qg_757bf552_73:s -> network_br_int:qr_43b83157_3b:n [color = "#0066cc", penwidth = "4"]
}
}

View File

@ -0,0 +1,204 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.36.0 (20140111.2315)
-->
<!-- Title: DON_DON Pages: 1 -->
<svg width="576pt" height="720pt"
viewBox="0.00 0.00 576.00 720.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 716)">
<title>DON_DON</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-716 572,-716 572,4 -4,4"/>
<g id="clust1" class="cluster"><title>cluster_DONComputeNode</title>
<polygon fill="lightgrey" stroke="black" points="8,-8 8,-704 286,-704 286,-8 8,-8"/>
</g>
<g id="clust2" class="cluster"><title>cluster_ComputeNode</title>
<polygon fill="lightgrey" stroke="black" points="133,-640 133,-696 253,-696 253,-640 133,-640"/>
</g>
<g id="clust3" class="cluster"><title>cluster_Nova</title>
<polygon fill="lightgrey" stroke="black" points="16,-436 16,-592 278,-592 278,-436 16,-436"/>
</g>
<g id="clust4" class="cluster"><title>cluster_VMs</title>
<polygon fill="lightgrey" stroke="black" points="116,-444 116,-584 270,-584 270,-444 116,-444"/>
</g>
<g id="clust5" class="cluster"><title>cluster_LinuxBridge</title>
<polygon fill="lightgrey" stroke="black" points="24,-488 24,-540 108,-540 108,-488 24,-488"/>
</g>
<g id="clust6" class="cluster"><title>cluster_OVS</title>
<polygon fill="lightgrey" stroke="black" points="16,-16 16,-354 274,-354 274,-16 16,-16"/>
</g>
<g id="clust7" class="cluster"><title>cluster_compute_br_int</title>
<polygon fill="lightgrey" stroke="black" points="24,-206 24,-346 266,-346 266,-206 24,-206"/>
</g>
<g id="clust8" class="cluster"><title>cluster_compute_br_tun</title>
<polygon fill="lightgrey" stroke="black" points="89,-24 89,-108 201,-108 201,-24 89,-24"/>
</g>
<g id="clust9" class="cluster"><title>cluster_DONNetworkNode</title>
<polygon fill="lightgrey" stroke="black" points="294,-8 294,-704 560,-704 560,-8 294,-8"/>
</g>
<g id="clust11" class="cluster"><title>cluster_OVS</title>
<polygon fill="lightgrey" stroke="black" points="302,-16 302,-592 552,-592 552,-16 302,-16"/>
</g>
<g id="clust12" class="cluster"><title>cluster_br_ex</title>
<polygon fill="lightgrey" stroke="black" points="310,-444 310,-584 448,-584 448,-444 310,-444"/>
</g>
<g id="clust13" class="cluster"><title>cluster_network_br_int</title>
<polygon fill="lightgrey" stroke="black" points="310,-164 310,-388 544,-388 544,-164 310,-164"/>
</g>
<g id="clust14" class="cluster"><title>cluster_network_br_tun</title>
<polygon fill="lightgrey" stroke="black" points="372,-24 372,-108 484,-108 484,-24 372,-24"/>
</g>
<g id="clust10" class="cluster"><title>cluster_NetworkNode</title>
<polygon fill="lightgrey" stroke="black" points="320,-640 320,-696 438,-696 438,-640 320,-640"/>
</g>
<!-- ComputeNode -->
<g id="node1" class="node"><title>ComputeNode</title>
<polygon fill="red" stroke="none" points="149,-652 149,-684 237,-684 237,-652 149,-652"/>
<polygon fill="yellow" stroke="none" points="154,-657 154,-679 232,-679 232,-657 154,-657"/>
<text text-anchor="start" x="159.5" y="-665.5" font-family="Helvetica,sans-Serif" font-size="10.00">Compute Node</text>
</g>
<!-- VMs -->
<g id="node2" class="node"><title>VMs</title>
<polygon fill="white" stroke="none" points="132,-456 132,-572 254,-572 254,-456 132,-456"/>
<polygon fill="white" stroke="none" points="137,-545 137,-567 249,-567 249,-545 137,-545"/>
<text text-anchor="start" x="182.5" y="-553.5" font-family="Helvetica,sans-Serif" font-size="10.00">VMs</text>
<polygon fill="#ff9933" stroke="none" points="137,-517 137,-540 191,-540 191,-517 137,-517"/>
<polygon fill="none" stroke="black" points="137,-517 137,-540 191,-540 191,-517 137,-517"/>
<text text-anchor="start" x="154.5" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">vm1</text>
<polygon fill="#ff9933" stroke="none" points="196,-517 196,-540 249,-540 249,-517 196,-517"/>
<polygon fill="none" stroke="black" points="196,-517 196,-540 249,-540 249,-517 196,-517"/>
<text text-anchor="start" x="213" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">vm2</text>
<polygon fill="#c079f3" stroke="none" points="137,-489 137,-512 191,-512 191,-489 137,-489"/>
<polygon fill="none" stroke="black" points="137,-489 137,-512 191,-512 191,-489 137,-489"/>
<text text-anchor="start" x="146.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#c079f3" stroke="none" points="196,-489 196,-512 249,-512 249,-489 196,-489"/>
<polygon fill="none" stroke="black" points="196,-489 196,-512 249,-512 249,-489 196,-489"/>
<text text-anchor="start" x="205" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#c079f3" stroke="none" points="137,-461 137,-484 191,-484 191,-461 137,-461"/>
<polygon fill="none" stroke="black" points="137,-461 137,-484 191,-484 191,-461 137,-461"/>
<text text-anchor="start" x="143.5" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.3</text>
<polygon fill="#c079f3" stroke="none" points="196,-461 196,-484 249,-484 249,-461 196,-461"/>
<polygon fill="none" stroke="black" points="196,-461 196,-484 249,-484 249,-461 196,-461"/>
<text text-anchor="start" x="202" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.4</text>
</g>
<!-- ComputeNode&#45;&gt;VMs -->
<!-- LinuxBridge -->
<g id="node3" class="node"><title>LinuxBridge</title>
<text text-anchor="middle" x="66" y="-511.5" font-family="Helvetica,sans-Serif" font-size="10.00">LinuxBridge</text>
</g>
<!-- compute_br_int -->
<g id="node4" class="node"><title>compute_br_int</title>
<polygon fill="white" stroke="none" points="40,-218 40,-334 250,-334 250,-218 40,-218"/>
<polygon fill="white" stroke="none" points="45,-307 45,-329 245,-329 245,-307 45,-307"/>
<text text-anchor="start" x="120.5" y="-315.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_int</text>
<polygon fill="#c079f3" stroke="none" points="45,-279 45,-302 144,-302 144,-279 45,-279"/>
<polygon fill="none" stroke="black" points="45,-279 45,-302 144,-302 144,-279 45,-279"/>
<text text-anchor="start" x="51.5" y="-288" font-family="Helvetica,sans-Serif" font-size="10.00">[6] qvo8aa60600&#45;7b</text>
<polygon fill="#c079f3" stroke="none" points="149,-279 149,-302 245,-302 245,-279 149,-279"/>
<polygon fill="none" stroke="black" points="149,-279 149,-302 245,-302 245,-279 149,-279"/>
<text text-anchor="start" x="155" y="-288" font-family="Helvetica,sans-Serif" font-size="10.00">[7] qvo71ac5bef&#45;7c</text>
<polygon fill="#c079f3" stroke="none" points="45,-251 45,-274 144,-274 144,-251 45,-251"/>
<polygon fill="none" stroke="black" points="45,-251 45,-274 144,-274 144,-251 45,-251"/>
<text text-anchor="start" x="68.5" y="-260" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="149,-251 149,-274 245,-274 245,-251 149,-251"/>
<polygon fill="none" stroke="black" points="149,-251 149,-274 245,-274 245,-251 149,-251"/>
<text text-anchor="start" x="171" y="-260" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#ffcc00" stroke="none" points="45,-223 45,-246 245,-246 245,-223 45,-223"/>
<polygon fill="none" stroke="black" points="45,-223 45,-246 245,-246 245,-223 45,-223"/>
<text text-anchor="start" x="117.5" y="-232" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;tun</text>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge2" class="edge"><title>LinuxBridge:qvb8aa60600_7b:s&#45;&gt;compute_br_int:qvo8aa60600_7b:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M69.8346,-495.954C77.5031,-460.323 94,-375.275 94,-303"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge3" class="edge"><title>LinuxBridge:qvb71ac5bef_7c:s&#45;&gt;compute_br_int:qvo71ac5bef_7c:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M76.0841,-495.784C85.3069,-480.12 99.3923,-456.399 112,-436 148.882,-376.326 197,-373.152 197,-303"/>
</g>
<!-- compute_br_tun -->
<g id="node5" class="node"><title>compute_br_tun</title>
<polygon fill="white" stroke="none" points="105,-36 105,-96 185,-96 185,-36 105,-36"/>
<polygon fill="white" stroke="none" points="110,-69 110,-91 180,-91 180,-69 110,-69"/>
<text text-anchor="start" x="119" y="-77.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_tun</text>
<polygon fill="#ffcc00" stroke="none" points="110,-41 110,-64 180,-64 180,-41 110,-41"/>
<polygon fill="none" stroke="black" points="110,-41 110,-64 180,-64 180,-41 110,-41"/>
<text text-anchor="start" x="119" y="-50" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;int</text>
</g>
<!-- compute_br_int&#45;&gt;compute_br_tun -->
<g id="edge4" class="edge"><title>compute_br_int:patch_tun:s&#45;&gt;compute_br_tun:patch_int:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M145,-222C145,-152.222 145,-134.778 145,-65"/>
</g>
<!-- NetworkNode -->
<g id="node6" class="node"><title>NetworkNode</title>
<polygon fill="red" stroke="none" points="336.5,-652 336.5,-684 421.5,-684 421.5,-652 336.5,-652"/>
<polygon fill="yellow" stroke="none" points="342,-657 342,-679 417,-679 417,-657 342,-657"/>
<text text-anchor="start" x="347.5" y="-665.5" font-family="Helvetica,sans-Serif" font-size="10.00">Network Node</text>
</g>
<!-- br_ex -->
<g id="node7" class="node"><title>br_ex</title>
<polygon fill="white" stroke="none" points="326.5,-456 326.5,-572 431.5,-572 431.5,-456 326.5,-456"/>
<polygon fill="white" stroke="none" points="332,-545 332,-567 427,-567 427,-545 332,-545"/>
<text text-anchor="start" x="355" y="-553.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_ex</text>
<polygon fill="#ff9933" stroke="none" points="332,-517 332,-540 427,-540 427,-517 332,-517"/>
<polygon fill="none" stroke="black" points="332,-517 332,-540 427,-540 427,-517 332,-517"/>
<text text-anchor="start" x="364" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">router1</text>
<polygon fill="#ff9933" stroke="none" points="332,-489 332,-512 427,-512 427,-489 332,-489"/>
<polygon fill="none" stroke="black" points="332,-489 332,-512 427,-512 427,-489 332,-489"/>
<text text-anchor="start" x="349.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">172.24.4.3/24</text>
<polygon fill="#ff9933" stroke="none" points="332,-461 332,-484 427,-484 427,-461 332,-461"/>
<polygon fill="none" stroke="black" points="332,-461 332,-484 427,-484 427,-461 332,-461"/>
<text text-anchor="start" x="338.5" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">[2] qg&#45;757bf552&#45;73</text>
</g>
<!-- NetworkNode&#45;&gt;br_ex -->
<!-- network_br_int -->
<g id="node8" class="node"><title>network_br_int</title>
<polygon fill="white" stroke="none" points="326.5,-176 326.5,-376 527.5,-376 527.5,-176 326.5,-176"/>
<polygon fill="white" stroke="none" points="332,-349 332,-371 523,-371 523,-349 332,-349"/>
<text text-anchor="start" x="403" y="-357.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_int</text>
<polygon fill="#c079f3" stroke="none" points="332,-321 332,-344 427,-344 427,-321 332,-321"/>
<polygon fill="none" stroke="black" points="332,-321 332,-344 427,-344 427,-321 332,-321"/>
<text text-anchor="start" x="338.5" y="-330" font-family="Helvetica,sans-Serif" font-size="10.00">[8] qr&#45;43b83157&#45;3b</text>
<polygon fill="#c079f3" stroke="none" points="432,-321 432,-344 523,-344 523,-321 432,-321"/>
<polygon fill="none" stroke="black" points="432,-321 432,-344 523,-344 523,-321 432,-321"/>
<text text-anchor="start" x="438" y="-330" font-family="Helvetica,sans-Serif" font-size="10.00">[5] tap59f90a3b&#45;f5</text>
<polygon fill="#c079f3" stroke="none" points="332,-293 332,-316 427,-316 427,-293 332,-293"/>
<polygon fill="none" stroke="black" points="332,-293 332,-316 427,-316 427,-293 332,-293"/>
<text text-anchor="start" x="353.5" y="-302" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="432,-293 432,-316 523,-316 523,-293 432,-293"/>
<polygon fill="none" stroke="black" points="432,-293 432,-316 523,-316 523,-293 432,-293"/>
<text text-anchor="start" x="451.5" y="-302" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="332,-265 332,-288 427,-288 427,-265 332,-265"/>
<polygon fill="none" stroke="black" points="332,-265 332,-288 427,-288 427,-265 332,-265"/>
<text text-anchor="start" x="352" y="-274" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.1/24</text>
<polygon fill="#c079f3" stroke="none" points="432,-265 432,-288 523,-288 523,-265 432,-265"/>
<polygon fill="none" stroke="black" points="432,-265 432,-288 523,-288 523,-265 432,-265"/>
<text text-anchor="start" x="450" y="-274" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.2/24</text>
<polygon fill="#c079f3" stroke="none" points="332,-237 332,-260 523,-260 523,-237 332,-237"/>
<polygon fill="none" stroke="black" points="332,-237 332,-260 523,-260 523,-237 332,-237"/>
<text text-anchor="start" x="410" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#ff9933" stroke="none" points="332,-209 332,-232 523,-232 523,-209 332,-209"/>
<polygon fill="none" stroke="black" points="332,-209 332,-232 523,-232 523,-209 332,-209"/>
<text text-anchor="start" x="412" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">router1</text>
<polygon fill="#ffcc00" stroke="none" points="332,-181 332,-204 523,-204 523,-181 332,-181"/>
<polygon fill="none" stroke="black" points="332,-181 332,-204 523,-204 523,-181 332,-181"/>
<text text-anchor="start" x="400" y="-190" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;tun</text>
</g>
<!-- br_ex&#45;&gt;network_br_int -->
<g id="edge7" class="edge"><title>br_ex:qg_757bf552_73:s&#45;&gt;network_br_int:qr_43b83157_3b:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M380,-460C380,-408.887 379,-396.113 379,-345"/>
</g>
<!-- network_br_tun -->
<g id="node9" class="node"><title>network_br_tun</title>
<polygon fill="white" stroke="none" points="388,-36 388,-96 468,-96 468,-36 388,-36"/>
<polygon fill="white" stroke="none" points="393,-69 393,-91 463,-91 463,-69 393,-69"/>
<text text-anchor="start" x="402" y="-77.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_tun</text>
<polygon fill="#ffcc00" stroke="none" points="393,-41 393,-64 463,-64 463,-41 393,-41"/>
<polygon fill="none" stroke="black" points="393,-41 393,-64 463,-64 463,-41 393,-41"/>
<text text-anchor="start" x="402" y="-50" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;int</text>
</g>
<!-- network_br_int&#45;&gt;network_br_tun -->
<g id="edge6" class="edge"><title>network_br_int:patch_tun:s&#45;&gt;network_br_tun:patch_int:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M428,-180C428,-128.889 428,-116.111 428,-65"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -0,0 +1,92 @@
digraph DON_network {
graph [fontsize=10 fontname="Helvetica"];
node [fontsize=10 fontname="Helvetica"];
rankdir = TB;
ranksep = 1;
concentrate = true;
compound = true;
edge [dir=none]
subgraph cluster_NetworkNode {
NetworkNode [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="red">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="yellow" PORT="NetworkNode">Network Node</TD>
</TR>
</TABLE>>];
}
subgraph cluster_OVS {
style=filled
subgraph cluster_br_ex {
br_ex [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="white" PORT="OVSbr_ex">OVS br_ex</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="router1">router1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="172.24.4.3/24">172.24.4.3/24</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="qg_757bf552_73">[2] qg-757bf552-73</TD>
</TR>
</TABLE>>];
}
subgraph cluster_network_br_int {
network_br_int [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_int">OVS br_int</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_43b83157_3b">[8] qr-43b83157-3b</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tap59f90a3b_f5">[5] tap59f90a3b-f5</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_43b83157_3btag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tap59f90a3b_f5tag_2">VLAN tag:2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_43b83157_3b10.10.0.1/24">10.10.0.1/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tap59f90a3b_f510.10.0.2/24">10.10.0.2/24</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#c079f3" PORT="private1">private1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ff9933" PORT="router1">router1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ffcc00" PORT="patch_tun">[1] patch-tun</TD>
</TR>
</TABLE>>];
}
subgraph cluster_network_br_tun {
network_br_tun [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_tun">OVS br_tun</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ffcc00" PORT="patch_int">[1] patch-int</TD>
</TR>
</TABLE>>];
}
}
NetworkNode:s -> br_ex:n [color = "#0066cc", penwidth = "4", style="invis"]
network_br_int:patch_tun:s -> network_br_tun:patch_int:n [color = "#0066cc", penwidth = "4"]
br_ex:qg_757bf552_73:s -> network_br_int:qr_43b83157_3b:n [color = "#0066cc", penwidth = "4"]
}

View File

@ -0,0 +1,100 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.36.0 (20140111.2315)
-->
<!-- Title: DON_network Pages: 1 -->
<svg width="274pt" height="704pt"
viewBox="0.00 0.00 274.00 704.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 700)">
<title>DON_network</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-700 270,-700 270,4 -4,4"/>
<g id="clust1" class="cluster"><title>cluster_NetworkNode</title>
<polygon fill="none" stroke="black" points="26,-632 26,-688 144,-688 144,-632 26,-632"/>
</g>
<g id="clust2" class="cluster"><title>cluster_OVS</title>
<polygon fill="lightgrey" stroke="black" points="8,-8 8,-584 258,-584 258,-8 8,-8"/>
</g>
<g id="clust3" class="cluster"><title>cluster_br_ex</title>
<polygon fill="lightgrey" stroke="black" points="16,-436 16,-576 154,-576 154,-436 16,-436"/>
</g>
<g id="clust4" class="cluster"><title>cluster_network_br_int</title>
<polygon fill="lightgrey" stroke="black" points="16,-156 16,-380 250,-380 250,-156 16,-156"/>
</g>
<g id="clust5" class="cluster"><title>cluster_network_br_tun</title>
<polygon fill="lightgrey" stroke="black" points="78,-16 78,-100 190,-100 190,-16 78,-16"/>
</g>
<!-- NetworkNode -->
<g id="node1" class="node"><title>NetworkNode</title>
<polygon fill="red" stroke="none" points="42.5,-644 42.5,-676 127.5,-676 127.5,-644 42.5,-644"/>
<polygon fill="yellow" stroke="none" points="48,-649 48,-671 123,-671 123,-649 48,-649"/>
<text text-anchor="start" x="53.5" y="-657.5" font-family="Helvetica,sans-Serif" font-size="10.00">Network Node</text>
</g>
<!-- br_ex -->
<g id="node2" class="node"><title>br_ex</title>
<polygon fill="white" stroke="none" points="32.5,-448 32.5,-564 137.5,-564 137.5,-448 32.5,-448"/>
<polygon fill="white" stroke="none" points="38,-537 38,-559 133,-559 133,-537 38,-537"/>
<text text-anchor="start" x="61" y="-545.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_ex</text>
<polygon fill="#ff9933" stroke="none" points="38,-509 38,-532 133,-532 133,-509 38,-509"/>
<polygon fill="none" stroke="black" points="38,-509 38,-532 133,-532 133,-509 38,-509"/>
<text text-anchor="start" x="70" y="-518" font-family="Helvetica,sans-Serif" font-size="10.00">router1</text>
<polygon fill="#ff9933" stroke="none" points="38,-481 38,-504 133,-504 133,-481 38,-481"/>
<polygon fill="none" stroke="black" points="38,-481 38,-504 133,-504 133,-481 38,-481"/>
<text text-anchor="start" x="55.5" y="-490" font-family="Helvetica,sans-Serif" font-size="10.00">172.24.4.3/24</text>
<polygon fill="#ff9933" stroke="none" points="38,-453 38,-476 133,-476 133,-453 38,-453"/>
<polygon fill="none" stroke="black" points="38,-453 38,-476 133,-476 133,-453 38,-453"/>
<text text-anchor="start" x="44.5" y="-462" font-family="Helvetica,sans-Serif" font-size="10.00">[2] qg&#45;757bf552&#45;73</text>
</g>
<!-- NetworkNode&#45;&gt;br_ex -->
<!-- network_br_int -->
<g id="node3" class="node"><title>network_br_int</title>
<polygon fill="white" stroke="none" points="32.5,-168 32.5,-368 233.5,-368 233.5,-168 32.5,-168"/>
<polygon fill="white" stroke="none" points="38,-341 38,-363 229,-363 229,-341 38,-341"/>
<text text-anchor="start" x="109" y="-349.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_int</text>
<polygon fill="#c079f3" stroke="none" points="38,-313 38,-336 133,-336 133,-313 38,-313"/>
<polygon fill="none" stroke="black" points="38,-313 38,-336 133,-336 133,-313 38,-313"/>
<text text-anchor="start" x="44.5" y="-322" font-family="Helvetica,sans-Serif" font-size="10.00">[8] qr&#45;43b83157&#45;3b</text>
<polygon fill="#c079f3" stroke="none" points="138,-313 138,-336 229,-336 229,-313 138,-313"/>
<polygon fill="none" stroke="black" points="138,-313 138,-336 229,-336 229,-313 138,-313"/>
<text text-anchor="start" x="144" y="-322" font-family="Helvetica,sans-Serif" font-size="10.00">[5] tap59f90a3b&#45;f5</text>
<polygon fill="#c079f3" stroke="none" points="38,-285 38,-308 133,-308 133,-285 38,-285"/>
<polygon fill="none" stroke="black" points="38,-285 38,-308 133,-308 133,-285 38,-285"/>
<text text-anchor="start" x="59.5" y="-294" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="138,-285 138,-308 229,-308 229,-285 138,-285"/>
<polygon fill="none" stroke="black" points="138,-285 138,-308 229,-308 229,-285 138,-285"/>
<text text-anchor="start" x="157.5" y="-294" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="38,-257 38,-280 133,-280 133,-257 38,-257"/>
<polygon fill="none" stroke="black" points="38,-257 38,-280 133,-280 133,-257 38,-257"/>
<text text-anchor="start" x="58" y="-266" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.1/24</text>
<polygon fill="#c079f3" stroke="none" points="138,-257 138,-280 229,-280 229,-257 138,-257"/>
<polygon fill="none" stroke="black" points="138,-257 138,-280 229,-280 229,-257 138,-257"/>
<text text-anchor="start" x="156" y="-266" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.2/24</text>
<polygon fill="#c079f3" stroke="none" points="38,-229 38,-252 229,-252 229,-229 38,-229"/>
<polygon fill="none" stroke="black" points="38,-229 38,-252 229,-252 229,-229 38,-229"/>
<text text-anchor="start" x="116" y="-238" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#ff9933" stroke="none" points="38,-201 38,-224 229,-224 229,-201 38,-201"/>
<polygon fill="none" stroke="black" points="38,-201 38,-224 229,-224 229,-201 38,-201"/>
<text text-anchor="start" x="118" y="-210" font-family="Helvetica,sans-Serif" font-size="10.00">router1</text>
<polygon fill="#ffcc00" stroke="none" points="38,-173 38,-196 229,-196 229,-173 38,-173"/>
<polygon fill="none" stroke="black" points="38,-173 38,-196 229,-196 229,-173 38,-173"/>
<text text-anchor="start" x="106" y="-182" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;tun</text>
</g>
<!-- br_ex&#45;&gt;network_br_int -->
<g id="edge3" class="edge"><title>br_ex:qg_757bf552_73:s&#45;&gt;network_br_int:qr_43b83157_3b:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M86,-452C86,-400.887 85,-388.113 85,-337"/>
</g>
<!-- network_br_tun -->
<g id="node4" class="node"><title>network_br_tun</title>
<polygon fill="white" stroke="none" points="94,-28 94,-88 174,-88 174,-28 94,-28"/>
<polygon fill="white" stroke="none" points="99,-61 99,-83 169,-83 169,-61 99,-61"/>
<text text-anchor="start" x="108" y="-69.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_tun</text>
<polygon fill="#ffcc00" stroke="none" points="99,-33 99,-56 169,-56 169,-33 99,-33"/>
<polygon fill="none" stroke="black" points="99,-33 99,-56 169,-56 169,-33 99,-33"/>
<text text-anchor="start" x="108" y="-42" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;int</text>
</g>
<!-- network_br_int&#45;&gt;network_br_tun -->
<g id="edge2" class="edge"><title>network_br_int:patch_tun:s&#45;&gt;network_br_tun:patch_int:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M134,-172C134,-120.889 134,-108.111 134,-57"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

@ -0,0 +1,278 @@
digraph DON_DON {
graph [fontsize=10 fontname="Helvetica"];
node [fontsize=10 fontname="Helvetica"];
rankdir = TB;
ranksep = 1;
concentrate = true;
compound = true;
edge [dir=none]
subgraph cluster_DONComputeNode {
style=filled
subgraph cluster_ComputeNode {
ComputeNode [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="red">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="yellow" PORT="ComputeNode">Compute Node</TD>
</TR>
</TABLE>>];
}
subgraph cluster_Nova {
style=filled
subgraph cluster_VMs {
VMs [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="7" BORDER="0" BGCOLOR="white" PORT="VMs">VMs</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">VM1-1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">VM1-2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">VM3-1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">VM3-2</TD>
<TD ROWSPAN="1" COLSPAN="3" BGCOLOR="#909090">VM4</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">private1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">private1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">private2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">private2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">public</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">private2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">private1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="10023">10.0.2.3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="10024">10.0.2.4</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="10033">10.0.3.3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="10034">10.0.3.4</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="1722445">172.24.4.5</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="10036">10.0.3.6</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="10026">10.0.2.6</TD>
</TR>
</TABLE>>];
}
subgraph cluster_LinuxBridge {
LinuxBridge [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="7" BORDER="0" BGCOLOR="white" PORT="LinuxBridge">Linux Bridge</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="tape0d697f2_cb">tape0d697f2-cb</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapbd4f1f72_5f">tapbd4f1f72-5f</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="tapbd96ca7d_5e">tapbd96ca7d-5e</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tap4441e3a6_f2">tap4441e3a6-f2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapce3d7b20_1d">tapce3d7b20-1d</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapf0841d56_02">tapf0841d56-02</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapfbb76083_60">tapfbb76083-60</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qbre0d697f2_cb">qbre0d697f2-cb</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qbrbd4f1f72_5f">qbrbd4f1f72-5f</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qbrbd96ca7d_5e">qbrbd96ca7d-5e</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qbr4441e3a6_f2">qbr4441e3a6-f2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qbrce3d7b20_1d">qbrce3d7b20-1d</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qbrf0841d56_02">qbrf0841d56-02</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qbrfbb76083_60">qbrfbb76083-60</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qvbe0d697f2_cb">qvbe0d697f2-cb</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvbbd4f1f72_5f">qvbbd4f1f72-5f</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qvbbd96ca7d_5e">qvbbd96ca7d-5e</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvb4441e3a6_f2">qvb4441e3a6-f2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvbce3d7b20_1d">qvbce3d7b20-1d</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvbf0841d56_02">qvbf0841d56-02</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvbfbb76083_60">qvbfbb76083-60</TD>
</TR>
</TABLE>>];
}
}
subgraph cluster_OVS {
style=filled
subgraph cluster_compute_br_int {
compute_br_int [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="7" BORDER="0" BGCOLOR="white" PORT="OVSbr_int">OVS br_int</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qvoe0d697f2_cb">[9] qvoe0d697f2-cb</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvobd4f1f72_5f">[10] qvobd4f1f72-5f</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qvobd96ca7d_5e">[11] qvobd96ca7d-5e</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvo4441e3a6_f2">[12] qvo4441e3a6-f2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvoce3d7b20_1d">[17] qvoce3d7b20-1d</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvof0841d56_02">[16] qvof0841d56-02</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvofbb76083_60">[15] qvofbb76083-60</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvoe0d697f2_cbtag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvobd4f1f72_5ftag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvobd96ca7d_5etag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvo4441e3a6_f2tag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvoce3d7b20_1dtag_4">VLAN tag:4</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvof0841d56_02tag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvofbb76083_60tag_2">VLAN tag:2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="7" BGCOLOR="#909090" PORT="patch_tun">[1] patch-tun</TD>
</TR>
</TABLE>>];
}
subgraph cluster_compute_br_tun {
compute_br_tun [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="7" BORDER="0" BGCOLOR="white" PORT="OVSbr_tun">OVS br_tun</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="7" BGCOLOR="#909090" PORT="patch_int">[1] patch-int</TD>
</TR>
</TABLE>>];
}
}
ComputeNode:s -> VMs:n [color = "#909090", penwidth = "4", style="invis"]
VMs:10023:s -> LinuxBridge:tape0d697f2_cb:n [color = "#009900", penwidth = "4"]
VMs:10024:s -> LinuxBridge:tapbd4f1f72_5f:n [color = "#909090", penwidth = "4"]
VMs:10033:s -> LinuxBridge:tapbd96ca7d_5e:n [color = "#009900", penwidth = "4"]
VMs:10034:s -> LinuxBridge:tap4441e3a6_f2:n [color = "#909090", penwidth = "4"]
VMs:1722445:s -> LinuxBridge:tapce3d7b20_1d:n [color = "#909090", penwidth = "4"]
VMs:10036:s -> LinuxBridge:tapf0841d56_02:n [color = "#909090", penwidth = "4"]
VMs:10026:s -> LinuxBridge:tapfbb76083_60:n [color = "#909090", penwidth = "4"]
LinuxBridge:qvbe0d697f2_cb:s -> compute_br_int:qvoe0d697f2_cb:n [color = "#009900", penwidth = "4"]
LinuxBridge:qvbbd4f1f72_5f:s -> compute_br_int:qvobd4f1f72_5f:n [color = "#909090", penwidth = "4"]
LinuxBridge:qvbbd96ca7d_5e:s -> compute_br_int:qvobd96ca7d_5e:n [color = "#009900", penwidth = "4"]
LinuxBridge:qvb4441e3a6_f2:s -> compute_br_int:qvo4441e3a6_f2:n [color = "#909090", penwidth = "4"]
LinuxBridge:qvbce3d7b20_1d:s -> compute_br_int:qvoce3d7b20_1d:n [color = "#909090", penwidth = "4"]
LinuxBridge:qvbf0841d56_02:s -> compute_br_int:qvof0841d56_02:n [color = "#909090", penwidth = "4"]
LinuxBridge:qvbfbb76083_60:s -> compute_br_int:qvofbb76083_60:n [color = "#909090", penwidth = "4"]
compute_br_int:patch_tun:s -> compute_br_tun:patch_int:n [color = "#909090", penwidth = "4"]
}
subgraph cluster_DONNetworkNode {
style=filled
subgraph cluster_NetworkNode {
NetworkNode [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="red">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="yellow" PORT="NetworkNode">Network Node</TD>
</TR>
</TABLE>>];
}
subgraph cluster_OVS {
style=filled
subgraph cluster_br_ex {
br_ex [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_ex">OVS br_ex</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="router1">router1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="router2">router2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="172.24.4.3/24">172.24.4.3/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="172.24.4.4/24">172.24.4.4/24</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qg_eb8796fb_83">[2] qg-eb8796fb-83</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qg_e2b1b0d3_a8">[3] qg-e2b1b0d3-a8</TD>
</TR>
</TABLE>>];
}
subgraph cluster_network_br_int {
network_br_int [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="8" BORDER="0" BGCOLOR="white" PORT="OVSbr_int">OVS br_int</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qr_09a15e37_ca">[8] qr-09a15e37-ca</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd0828ef0_eb">[6] tapd0828ef0-eb</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qr_622abba5_e2">[7] qr-622abba5-e2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd6f091a2_c0">[5] tapd6f091a2-c0</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_361be2af_e5">[13] qr-361be2af-e5</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd6f091a2_c0">[5] tapd6f091a2-c0</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_b66b902a_36">[14] qr-b66b902a-36</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd0828ef0_eb">[6] tapd0828ef0-eb</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_09a15e37_catag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd0828ef0_ebtag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_622abba5_e2tag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd6f091a2_c0tag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_361be2af_e5tag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd6f091a2_c0tag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_b66b902a_36tag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd0828ef0_ebtag_3">VLAN tag:3</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_09a15e37_ca10.0.3.1/24">10.0.3.1/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd0828ef0_eb10.0.3.2/24">10.0.3.2/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_622abba5_e210.0.2.1/24">10.0.2.1/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd6f091a2_c010.0.2.2/24">10.0.2.2/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_361be2af_e510.0.2.5/24">10.0.2.5/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd6f091a2_c010.0.2.2/24">10.0.2.2/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_b66b902a_3610.0.3.5/24">10.0.3.5/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd0828ef0_eb10.0.3.2/24">10.0.3.2/24</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#909090" PORT="private2">private2</TD>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#909090" PORT="private1">private1</TD>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#909090" PORT="private1">private1</TD>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#909090" PORT="private2">private2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="4" BGCOLOR="#909090" PORT="router1">router1</TD>
<TD ROWSPAN="1" COLSPAN="4" BGCOLOR="#909090" PORT="router2">router2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="8" BGCOLOR="#909090" PORT="patch_tun">[1] patch-tun</TD>
</TR>
</TABLE>>];
}
subgraph cluster_network_br_tun {
network_br_tun [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="7" BORDER="0" BGCOLOR="white" PORT="OVSbr_tun">OVS br_tun</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="7" BGCOLOR="#909090" PORT="patch_int">[1] patch-int</TD>
</TR>
</TABLE>>];
}
}
NetworkNode:s -> br_ex:n [color = "#909090", penwidth = "4", style="invis"]
network_br_int:patch_tun:s -> network_br_tun:patch_int:n [color = "#909090", penwidth = "4"]
br_ex:qg_e2b1b0d3_a8:s -> network_br_int:qr_361be2af_e5:n [color = "#909090", penwidth = "4"]
br_ex:qg_e2b1b0d3_a8:s -> network_br_int:qr_b66b902a_36:n [color = "#909090", penwidth = "4"]
br_ex:qg_eb8796fb_83:s -> network_br_int:qr_09a15e37_ca:n [color = "#909090", penwidth = "4"]
br_ex:qg_eb8796fb_83:s -> network_br_int:qr_622abba5_e2:n [color = "#909090", penwidth = "4"]
}
}

View File

@ -0,0 +1,473 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.36.0 (20140111.2315)
-->
<!-- Title: DON_DON Pages: 1 -->
<svg width="1710pt" height="916pt"
viewBox="0.00 0.00 1710.00 916.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 912)">
<title>DON_DON</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-912 1706,-912 1706,4 -4,4"/>
<g id="clust1" class="cluster"><title>cluster_DONComputeNode</title>
<polygon fill="lightgrey" stroke="black" points="8,-8 8,-900 816,-900 816,-8 8,-8"/>
</g>
<g id="clust2" class="cluster"><title>cluster_ComputeNode</title>
<polygon fill="lightgrey" stroke="black" points="352,-836 352,-892 472,-892 472,-836 352,-836"/>
</g>
<g id="clust3" class="cluster"><title>cluster_Nova</title>
<polygon fill="lightgrey" stroke="black" points="79,-394 79,-788 741,-788 741,-394 79,-394"/>
</g>
<g id="clust4" class="cluster"><title>cluster_VMs</title>
<polygon fill="lightgrey" stroke="black" points="202,-640 202,-780 622,-780 622,-640 202,-640"/>
</g>
<g id="clust5" class="cluster"><title>cluster_LinuxBridge</title>
<polygon fill="lightgrey" stroke="black" points="87,-402 87,-542 733,-542 733,-402 87,-402"/>
</g>
<g id="clust6" class="cluster"><title>cluster_OVS</title>
<polygon fill="lightgrey" stroke="black" points="16,-16 16,-312 808,-312 808,-16 16,-16"/>
</g>
<g id="clust7" class="cluster"><title>cluster_compute_br_int</title>
<polygon fill="lightgrey" stroke="black" points="24,-164 24,-304 800,-304 800,-164 24,-164"/>
</g>
<g id="clust8" class="cluster"><title>cluster_compute_br_tun</title>
<polygon fill="lightgrey" stroke="black" points="343,-24 343,-108 481,-108 481,-24 343,-24"/>
</g>
<g id="clust9" class="cluster"><title>cluster_DONNetworkNode</title>
<polygon fill="lightgrey" stroke="black" points="824,-176 824,-900 1694,-900 1694,-176 824,-176"/>
</g>
<g id="clust11" class="cluster"><title>cluster_OVS</title>
<polygon fill="lightgrey" stroke="black" points="832,-184 832,-788 1686,-788 1686,-184 832,-184"/>
</g>
<g id="clust12" class="cluster"><title>cluster_br_ex</title>
<polygon fill="lightgrey" stroke="black" points="1088,-640 1088,-780 1326,-780 1326,-640 1088,-640"/>
</g>
<g id="clust13" class="cluster"><title>cluster_network_br_int</title>
<polygon fill="lightgrey" stroke="black" points="840,-360 840,-584 1678,-584 1678,-360 840,-360"/>
</g>
<g id="clust14" class="cluster"><title>cluster_network_br_tun</title>
<polygon fill="lightgrey" stroke="black" points="1189,-192 1189,-276 1327,-276 1327,-192 1189,-192"/>
</g>
<g id="clust10" class="cluster"><title>cluster_NetworkNode</title>
<polygon fill="lightgrey" stroke="black" points="1148,-836 1148,-892 1266,-892 1266,-836 1148,-836"/>
</g>
<!-- ComputeNode -->
<g id="node1" class="node"><title>ComputeNode</title>
<polygon fill="red" stroke="none" points="368,-848 368,-880 456,-880 456,-848 368,-848"/>
<polygon fill="yellow" stroke="none" points="373,-853 373,-875 451,-875 451,-853 373,-853"/>
<text text-anchor="start" x="378.5" y="-861.5" font-family="Helvetica,sans-Serif" font-size="10.00">Compute Node</text>
</g>
<!-- VMs -->
<g id="node2" class="node"><title>VMs</title>
<polygon fill="white" stroke="none" points="218.5,-652 218.5,-768 605.5,-768 605.5,-652 218.5,-652"/>
<polygon fill="white" stroke="none" points="224,-741 224,-763 601,-763 601,-741 224,-741"/>
<text text-anchor="start" x="402" y="-749.5" font-family="Helvetica,sans-Serif" font-size="10.00">VMs</text>
<polygon fill="#909090" stroke="none" points="224,-713 224,-736 273,-736 273,-713 224,-713"/>
<polygon fill="none" stroke="black" points="224,-713 224,-736 273,-736 273,-713 224,-713"/>
<text text-anchor="start" x="234" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">VM1&#45;1</text>
<polygon fill="#909090" stroke="none" points="278,-713 278,-736 326,-736 326,-713 278,-713"/>
<polygon fill="none" stroke="black" points="278,-713 278,-736 326,-736 326,-713 278,-713"/>
<text text-anchor="start" x="287.5" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">VM1&#45;2</text>
<polygon fill="#909090" stroke="none" points="331,-713 331,-736 379,-736 379,-713 331,-713"/>
<polygon fill="none" stroke="black" points="331,-713 331,-736 379,-736 379,-713 331,-713"/>
<text text-anchor="start" x="340.5" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">VM3&#45;1</text>
<polygon fill="#909090" stroke="none" points="384,-713 384,-736 432,-736 432,-713 384,-713"/>
<polygon fill="none" stroke="black" points="384,-713 384,-736 432,-736 432,-713 384,-713"/>
<text text-anchor="start" x="393.5" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">VM3&#45;2</text>
<polygon fill="#909090" stroke="none" points="437,-713 437,-736 601,-736 601,-713 437,-713"/>
<polygon fill="none" stroke="black" points="437,-713 437,-736 601,-736 601,-713 437,-713"/>
<text text-anchor="start" x="508.5" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">VM4</text>
<polygon fill="#909090" stroke="none" points="224,-685 224,-708 273,-708 273,-685 224,-685"/>
<polygon fill="none" stroke="black" points="224,-685 224,-708 273,-708 273,-685 224,-685"/>
<text text-anchor="start" x="231" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#909090" stroke="none" points="278,-685 278,-708 326,-708 326,-685 278,-685"/>
<polygon fill="none" stroke="black" points="278,-685 278,-708 326,-708 326,-685 278,-685"/>
<text text-anchor="start" x="284.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#909090" stroke="none" points="331,-685 331,-708 379,-708 379,-685 331,-685"/>
<polygon fill="none" stroke="black" points="331,-685 331,-708 379,-708 379,-685 331,-685"/>
<text text-anchor="start" x="337.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private2</text>
<polygon fill="#909090" stroke="none" points="384,-685 384,-708 432,-708 432,-685 384,-685"/>
<polygon fill="none" stroke="black" points="384,-685 384,-708 432,-708 432,-685 384,-685"/>
<text text-anchor="start" x="390.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private2</text>
<polygon fill="#909090" stroke="none" points="437,-685 437,-708 495,-708 495,-685 437,-685"/>
<polygon fill="none" stroke="black" points="437,-685 437,-708 495,-708 495,-685 437,-685"/>
<text text-anchor="start" x="453" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">public</text>
<polygon fill="#909090" stroke="none" points="500,-685 500,-708 548,-708 548,-685 500,-685"/>
<polygon fill="none" stroke="black" points="500,-685 500,-708 548,-708 548,-685 500,-685"/>
<text text-anchor="start" x="506.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private2</text>
<polygon fill="#909090" stroke="none" points="553,-685 553,-708 601,-708 601,-685 553,-685"/>
<polygon fill="none" stroke="black" points="553,-685 553,-708 601,-708 601,-685 553,-685"/>
<text text-anchor="start" x="559.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#b2f379" stroke="none" points="224,-657 224,-680 273,-680 273,-657 224,-657"/>
<polygon fill="none" stroke="black" points="224,-657 224,-680 273,-680 273,-657 224,-657"/>
<text text-anchor="start" x="230.5" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.3</text>
<polygon fill="#909090" stroke="none" points="278,-657 278,-680 326,-680 326,-657 278,-657"/>
<polygon fill="none" stroke="black" points="278,-657 278,-680 326,-680 326,-657 278,-657"/>
<text text-anchor="start" x="284" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.4</text>
<polygon fill="#b2f379" stroke="none" points="331,-657 331,-680 379,-680 379,-657 331,-657"/>
<polygon fill="none" stroke="black" points="331,-657 331,-680 379,-680 379,-657 331,-657"/>
<text text-anchor="start" x="337" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.3</text>
<polygon fill="#909090" stroke="none" points="384,-657 384,-680 432,-680 432,-657 384,-657"/>
<polygon fill="none" stroke="black" points="384,-657 384,-680 432,-680 432,-657 384,-657"/>
<text text-anchor="start" x="390" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.4</text>
<polygon fill="#909090" stroke="none" points="437,-657 437,-680 495,-680 495,-657 437,-657"/>
<polygon fill="none" stroke="black" points="437,-657 437,-680 495,-680 495,-657 437,-657"/>
<text text-anchor="start" x="443" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">172.24.4.5</text>
<polygon fill="#909090" stroke="none" points="500,-657 500,-680 548,-680 548,-657 500,-657"/>
<polygon fill="none" stroke="black" points="500,-657 500,-680 548,-680 548,-657 500,-657"/>
<text text-anchor="start" x="506" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.6</text>
<polygon fill="#909090" stroke="none" points="553,-657 553,-680 601,-680 601,-657 553,-657"/>
<polygon fill="none" stroke="black" points="553,-657 553,-680 601,-680 601,-657 553,-657"/>
<text text-anchor="start" x="559" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.6</text>
</g>
<!-- ComputeNode&#45;&gt;VMs -->
<!-- LinuxBridge -->
<g id="node3" class="node"><title>LinuxBridge</title>
<polygon fill="white" stroke="none" points="103,-414 103,-530 717,-530 717,-414 103,-414"/>
<polygon fill="white" stroke="none" points="108,-503 108,-525 712,-525 712,-503 108,-503"/>
<text text-anchor="start" x="382.5" y="-511.5" font-family="Helvetica,sans-Serif" font-size="10.00">Linux Bridge</text>
<polygon fill="#b2f379" stroke="none" points="108,-475 108,-498 191,-498 191,-475 108,-475"/>
<polygon fill="none" stroke="black" points="108,-475 108,-498 191,-498 191,-475 108,-475"/>
<text text-anchor="start" x="116" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tape0d697f2&#45;cb</text>
<polygon fill="#909090" stroke="none" points="196,-475 196,-498 273,-498 273,-475 196,-475"/>
<polygon fill="none" stroke="black" points="196,-475 196,-498 273,-498 273,-475 196,-475"/>
<text text-anchor="start" x="203" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tapbd4f1f72&#45;5f</text>
<polygon fill="#b2f379" stroke="none" points="278,-475 278,-498 362,-498 362,-475 278,-475"/>
<polygon fill="none" stroke="black" points="278,-475 278,-498 362,-498 362,-475 278,-475"/>
<text text-anchor="start" x="285" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tapbd96ca7d&#45;5e</text>
<polygon fill="#909090" stroke="none" points="367,-475 367,-498 449,-498 449,-475 367,-475"/>
<polygon fill="none" stroke="black" points="367,-475 367,-498 449,-498 449,-475 367,-475"/>
<text text-anchor="start" x="374.5" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tap4441e3a6&#45;f2</text>
<polygon fill="#909090" stroke="none" points="454,-475 454,-498 538,-498 538,-475 454,-475"/>
<polygon fill="none" stroke="black" points="454,-475 454,-498 538,-498 538,-475 454,-475"/>
<text text-anchor="start" x="461" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tapce3d7b20&#45;1d</text>
<polygon fill="#909090" stroke="none" points="543,-475 543,-498 625,-498 625,-475 543,-475"/>
<polygon fill="none" stroke="black" points="543,-475 543,-498 625,-498 625,-475 543,-475"/>
<text text-anchor="start" x="550.5" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tapf0841d56&#45;02</text>
<polygon fill="#909090" stroke="none" points="630,-475 630,-498 712,-498 712,-475 630,-475"/>
<polygon fill="none" stroke="black" points="630,-475 630,-498 712,-498 712,-475 630,-475"/>
<text text-anchor="start" x="637.5" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tapfbb76083&#45;60</text>
<polygon fill="#b2f379" stroke="none" points="108,-447 108,-470 191,-470 191,-447 108,-447"/>
<polygon fill="none" stroke="black" points="108,-447 108,-470 191,-470 191,-447 108,-447"/>
<text text-anchor="start" x="116" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbre0d697f2&#45;cb</text>
<polygon fill="#909090" stroke="none" points="196,-447 196,-470 273,-470 273,-447 196,-447"/>
<polygon fill="none" stroke="black" points="196,-447 196,-470 273,-470 273,-447 196,-447"/>
<text text-anchor="start" x="203" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbrbd4f1f72&#45;5f</text>
<polygon fill="#b2f379" stroke="none" points="278,-447 278,-470 362,-470 362,-447 278,-447"/>
<polygon fill="none" stroke="black" points="278,-447 278,-470 362,-470 362,-447 278,-447"/>
<text text-anchor="start" x="285" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbrbd96ca7d&#45;5e</text>
<polygon fill="#909090" stroke="none" points="367,-447 367,-470 449,-470 449,-447 367,-447"/>
<polygon fill="none" stroke="black" points="367,-447 367,-470 449,-470 449,-447 367,-447"/>
<text text-anchor="start" x="374.5" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbr4441e3a6&#45;f2</text>
<polygon fill="#909090" stroke="none" points="454,-447 454,-470 538,-470 538,-447 454,-447"/>
<polygon fill="none" stroke="black" points="454,-447 454,-470 538,-470 538,-447 454,-447"/>
<text text-anchor="start" x="461" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbrce3d7b20&#45;1d</text>
<polygon fill="#909090" stroke="none" points="543,-447 543,-470 625,-470 625,-447 543,-447"/>
<polygon fill="none" stroke="black" points="543,-447 543,-470 625,-470 625,-447 543,-447"/>
<text text-anchor="start" x="550.5" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbrf0841d56&#45;02</text>
<polygon fill="#909090" stroke="none" points="630,-447 630,-470 712,-470 712,-447 630,-447"/>
<polygon fill="none" stroke="black" points="630,-447 630,-470 712,-470 712,-447 630,-447"/>
<text text-anchor="start" x="637.5" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbrfbb76083&#45;60</text>
<polygon fill="#b2f379" stroke="none" points="108,-419 108,-442 191,-442 191,-419 108,-419"/>
<polygon fill="none" stroke="black" points="108,-419 108,-442 191,-442 191,-419 108,-419"/>
<text text-anchor="start" x="114.5" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvbe0d697f2&#45;cb</text>
<polygon fill="#909090" stroke="none" points="196,-419 196,-442 273,-442 273,-419 196,-419"/>
<polygon fill="none" stroke="black" points="196,-419 196,-442 273,-442 273,-419 196,-419"/>
<text text-anchor="start" x="202" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvbbd4f1f72&#45;5f</text>
<polygon fill="#b2f379" stroke="none" points="278,-419 278,-442 362,-442 362,-419 278,-419"/>
<polygon fill="none" stroke="black" points="278,-419 278,-442 362,-442 362,-419 278,-419"/>
<text text-anchor="start" x="284" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvbbd96ca7d&#45;5e</text>
<polygon fill="#909090" stroke="none" points="367,-419 367,-442 449,-442 449,-419 367,-419"/>
<polygon fill="none" stroke="black" points="367,-419 367,-442 449,-442 449,-419 367,-419"/>
<text text-anchor="start" x="373" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvb4441e3a6&#45;f2</text>
<polygon fill="#909090" stroke="none" points="454,-419 454,-442 538,-442 538,-419 454,-419"/>
<polygon fill="none" stroke="black" points="454,-419 454,-442 538,-442 538,-419 454,-419"/>
<text text-anchor="start" x="460" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvbce3d7b20&#45;1d</text>
<polygon fill="#909090" stroke="none" points="543,-419 543,-442 625,-442 625,-419 543,-419"/>
<polygon fill="none" stroke="black" points="543,-419 543,-442 625,-442 625,-419 543,-419"/>
<text text-anchor="start" x="549" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvbf0841d56&#45;02</text>
<polygon fill="#909090" stroke="none" points="630,-419 630,-442 712,-442 712,-419 630,-419"/>
<polygon fill="none" stroke="black" points="630,-419 630,-442 712,-442 712,-419 630,-419"/>
<text text-anchor="start" x="636" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvbfbb76083&#45;60</text>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge2" class="edge"><title>VMs:10023:s&#45;&gt;LinuxBridge:tape0d697f2_cb:n</title>
<path fill="none" stroke="#009900" stroke-width="4" d="M248,-656C248,-573.508 149,-581.492 149,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge3" class="edge"><title>VMs:10024:s&#45;&gt;LinuxBridge:tapbd4f1f72_5f:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M302,-656C302,-579.958 234,-575.042 234,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge4" class="edge"><title>VMs:10033:s&#45;&gt;LinuxBridge:tapbd96ca7d_5e:n</title>
<path fill="none" stroke="#009900" stroke-width="4" d="M355,-656C355,-584.509 320,-570.491 320,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge5" class="edge"><title>VMs:10034:s&#45;&gt;LinuxBridge:tap4441e3a6_f2:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M408,-656C408,-586.222 408,-568.778 408,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge6" class="edge"><title>VMs:1722445:s&#45;&gt;LinuxBridge:tapce3d7b20_1d:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M466,-656C466,-584.96 496,-570.04 496,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge7" class="edge"><title>VMs:10036:s&#45;&gt;LinuxBridge:tapf0841d56_02:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M524,-656C524,-581.3 584,-573.7 584,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge8" class="edge"><title>VMs:10026:s&#45;&gt;LinuxBridge:tapfbb76083_60:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M577,-656C577,-574.672 671,-580.328 671,-499"/>
</g>
<!-- compute_br_int -->
<g id="node4" class="node"><title>compute_br_int</title>
<polygon fill="white" stroke="none" points="40.5,-176 40.5,-292 783.5,-292 783.5,-176 40.5,-176"/>
<polygon fill="white" stroke="none" points="46,-265 46,-287 779,-287 779,-265 46,-265"/>
<text text-anchor="start" x="388" y="-273.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_int</text>
<polygon fill="#b2f379" stroke="none" points="46,-237 46,-260 143,-260 143,-237 46,-237"/>
<polygon fill="none" stroke="black" points="46,-237 46,-260 143,-260 143,-237 46,-237"/>
<text text-anchor="start" x="52.5" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[9] qvoe0d697f2&#45;cb</text>
<polygon fill="#909090" stroke="none" points="148,-237 148,-260 245,-260 245,-237 148,-237"/>
<polygon fill="none" stroke="black" points="148,-237 148,-260 245,-260 245,-237 148,-237"/>
<text text-anchor="start" x="154" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[10] qvobd4f1f72&#45;5f</text>
<polygon fill="#b2f379" stroke="none" points="250,-237 250,-260 353,-260 353,-237 250,-237"/>
<polygon fill="none" stroke="black" points="250,-237 250,-260 353,-260 353,-237 250,-237"/>
<text text-anchor="start" x="256" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[11] qvobd96ca7d&#45;5e</text>
<polygon fill="#909090" stroke="none" points="358,-237 358,-260 459,-260 459,-237 358,-237"/>
<polygon fill="none" stroke="black" points="358,-237 358,-260 459,-260 459,-237 358,-237"/>
<text text-anchor="start" x="364" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[12] qvo4441e3a6&#45;f2</text>
<polygon fill="#909090" stroke="none" points="464,-237 464,-260 567,-260 567,-237 464,-237"/>
<polygon fill="none" stroke="black" points="464,-237 464,-260 567,-260 567,-237 464,-237"/>
<text text-anchor="start" x="470" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[17] qvoce3d7b20&#45;1d</text>
<polygon fill="#909090" stroke="none" points="572,-237 572,-260 673,-260 673,-237 572,-237"/>
<polygon fill="none" stroke="black" points="572,-237 572,-260 673,-260 673,-237 572,-237"/>
<text text-anchor="start" x="578" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[16] qvof0841d56&#45;02</text>
<polygon fill="#909090" stroke="none" points="678,-237 678,-260 779,-260 779,-237 678,-237"/>
<polygon fill="none" stroke="black" points="678,-237 678,-260 779,-260 779,-237 678,-237"/>
<text text-anchor="start" x="684" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[15] qvofbb76083&#45;60</text>
<polygon fill="#909090" stroke="none" points="46,-209 46,-232 143,-232 143,-209 46,-209"/>
<polygon fill="none" stroke="black" points="46,-209 46,-232 143,-232 143,-209 46,-209"/>
<text text-anchor="start" x="68.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#909090" stroke="none" points="148,-209 148,-232 245,-232 245,-209 148,-209"/>
<polygon fill="none" stroke="black" points="148,-209 148,-232 245,-232 245,-209 148,-209"/>
<text text-anchor="start" x="170.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#909090" stroke="none" points="250,-209 250,-232 353,-232 353,-209 250,-209"/>
<polygon fill="none" stroke="black" points="250,-209 250,-232 353,-232 353,-209 250,-209"/>
<text text-anchor="start" x="275.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#909090" stroke="none" points="358,-209 358,-232 459,-232 459,-209 358,-209"/>
<polygon fill="none" stroke="black" points="358,-209 358,-232 459,-232 459,-209 358,-209"/>
<text text-anchor="start" x="382.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#909090" stroke="none" points="464,-209 464,-232 567,-232 567,-209 464,-209"/>
<polygon fill="none" stroke="black" points="464,-209 464,-232 567,-232 567,-209 464,-209"/>
<text text-anchor="start" x="489.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:4</text>
<polygon fill="#909090" stroke="none" points="572,-209 572,-232 673,-232 673,-209 572,-209"/>
<polygon fill="none" stroke="black" points="572,-209 572,-232 673,-232 673,-209 572,-209"/>
<text text-anchor="start" x="596.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#909090" stroke="none" points="678,-209 678,-232 779,-232 779,-209 678,-209"/>
<polygon fill="none" stroke="black" points="678,-209 678,-232 779,-232 779,-209 678,-209"/>
<text text-anchor="start" x="702.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#909090" stroke="none" points="46,-181 46,-204 779,-204 779,-181 46,-181"/>
<polygon fill="none" stroke="black" points="46,-181 46,-204 779,-204 779,-181 46,-181"/>
<text text-anchor="start" x="385" y="-190" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;tun</text>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge9" class="edge"><title>LinuxBridge:qvbe0d697f2_cb:s&#45;&gt;compute_br_int:qvoe0d697f2_cb:n</title>
<path fill="none" stroke="#009900" stroke-width="4" d="M149,-418C149,-344.064 94,-334.936 94,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge10" class="edge"><title>LinuxBridge:qvbbd4f1f72_5f:s&#45;&gt;compute_br_int:qvobd4f1f72_5f:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M234,-418C234,-346.207 196,-332.793 196,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge11" class="edge"><title>LinuxBridge:qvbbd96ca7d_5e:s&#45;&gt;compute_br_int:qvobd96ca7d_5e:n</title>
<path fill="none" stroke="#009900" stroke-width="4" d="M320,-418C320,-347.713 301,-331.287 301,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge12" class="edge"><title>LinuxBridge:qvb4441e3a6_f2:s&#45;&gt;compute_br_int:qvo4441e3a6_f2:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M408,-418C408,-348.222 408,-330.778 408,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge13" class="edge"><title>LinuxBridge:qvbce3d7b20_1d:s&#45;&gt;compute_br_int:qvoce3d7b20_1d:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M496,-418C496,-347.658 516,-331.342 516,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge14" class="edge"><title>LinuxBridge:qvbf0841d56_02:s&#45;&gt;compute_br_int:qvof0841d56_02:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M584,-418C584,-346.102 623,-332.898 623,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge15" class="edge"><title>LinuxBridge:qvbfbb76083_60:s&#45;&gt;compute_br_int:qvofbb76083_60:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M671,-418C671,-343.613 729,-335.387 729,-261"/>
</g>
<!-- compute_br_tun -->
<g id="node5" class="node"><title>compute_br_tun</title>
<polygon fill="white" stroke="none" points="359.5,-36 359.5,-96 464.5,-96 464.5,-36 359.5,-36"/>
<polygon fill="white" stroke="none" points="365,-69 365,-91 460,-91 460,-69 365,-69"/>
<text text-anchor="start" x="386.5" y="-77.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_tun</text>
<polygon fill="#909090" stroke="none" points="365,-41 365,-64 460,-64 460,-41 365,-41"/>
<polygon fill="none" stroke="black" points="365,-41 365,-64 460,-64 460,-41 365,-41"/>
<text text-anchor="start" x="386.5" y="-50" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;int</text>
</g>
<!-- compute_br_int&#45;&gt;compute_br_tun -->
<g id="edge16" class="edge"><title>compute_br_int:patch_tun:s&#45;&gt;compute_br_tun:patch_int:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M413,-180C413,-128.889 413,-116.111 413,-65"/>
</g>
<!-- NetworkNode -->
<g id="node6" class="node"><title>NetworkNode</title>
<polygon fill="red" stroke="none" points="1164.5,-848 1164.5,-880 1249.5,-880 1249.5,-848 1164.5,-848"/>
<polygon fill="yellow" stroke="none" points="1170,-853 1170,-875 1245,-875 1245,-853 1170,-853"/>
<text text-anchor="start" x="1175.5" y="-861.5" font-family="Helvetica,sans-Serif" font-size="10.00">Network Node</text>
</g>
<!-- br_ex -->
<g id="node7" class="node"><title>br_ex</title>
<polygon fill="white" stroke="none" points="1104,-652 1104,-768 1310,-768 1310,-652 1104,-652"/>
<polygon fill="white" stroke="none" points="1109,-741 1109,-763 1305,-763 1305,-741 1109,-741"/>
<text text-anchor="start" x="1182.5" y="-749.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_ex</text>
<polygon fill="#909090" stroke="none" points="1109,-713 1109,-736 1204,-736 1204,-713 1109,-713"/>
<polygon fill="none" stroke="black" points="1109,-713 1109,-736 1204,-736 1204,-713 1109,-713"/>
<text text-anchor="start" x="1141" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">router1</text>
<polygon fill="#909090" stroke="none" points="1209,-713 1209,-736 1305,-736 1305,-713 1209,-713"/>
<polygon fill="none" stroke="black" points="1209,-713 1209,-736 1305,-736 1305,-713 1209,-713"/>
<text text-anchor="start" x="1241.5" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">router2</text>
<polygon fill="#909090" stroke="none" points="1109,-685 1109,-708 1204,-708 1204,-685 1109,-685"/>
<polygon fill="none" stroke="black" points="1109,-685 1109,-708 1204,-708 1204,-685 1109,-685"/>
<text text-anchor="start" x="1126.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">172.24.4.3/24</text>
<polygon fill="#909090" stroke="none" points="1209,-685 1209,-708 1305,-708 1305,-685 1209,-685"/>
<polygon fill="none" stroke="black" points="1209,-685 1209,-708 1305,-708 1305,-685 1209,-685"/>
<text text-anchor="start" x="1227" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">172.24.4.4/24</text>
<polygon fill="#909090" stroke="none" points="1109,-657 1109,-680 1204,-680 1204,-657 1109,-657"/>
<polygon fill="none" stroke="black" points="1109,-657 1109,-680 1204,-680 1204,-657 1109,-657"/>
<text text-anchor="start" x="1115.5" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">[2] qg&#45;eb8796fb&#45;83</text>
<polygon fill="#909090" stroke="none" points="1209,-657 1209,-680 1305,-680 1305,-657 1209,-657"/>
<polygon fill="none" stroke="black" points="1209,-657 1209,-680 1305,-680 1305,-657 1209,-657"/>
<text text-anchor="start" x="1215" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">[3] qg&#45;e2b1b0d3&#45;a8</text>
</g>
<!-- NetworkNode&#45;&gt;br_ex -->
<!-- network_br_int -->
<g id="node8" class="node"><title>network_br_int</title>
<polygon fill="white" stroke="none" points="856,-372 856,-572 1662,-572 1662,-372 856,-372"/>
<polygon fill="white" stroke="none" points="861,-545 861,-567 1657,-567 1657,-545 861,-545"/>
<text text-anchor="start" x="1234.5" y="-553.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_int</text>
<polygon fill="#b2f379" stroke="none" points="861,-517 861,-540 956,-540 956,-517 861,-517"/>
<polygon fill="none" stroke="black" points="861,-517 861,-540 956,-540 956,-517 861,-517"/>
<text text-anchor="start" x="867.5" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[8] qr&#45;09a15e37&#45;ca</text>
<polygon fill="#909090" stroke="none" points="961,-517 961,-540 1055,-540 1055,-517 961,-517"/>
<polygon fill="none" stroke="black" points="961,-517 961,-540 1055,-540 1055,-517 961,-517"/>
<text text-anchor="start" x="967" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[6] tapd0828ef0&#45;eb</text>
<polygon fill="#b2f379" stroke="none" points="1060,-517 1060,-540 1154,-540 1154,-517 1060,-517"/>
<polygon fill="none" stroke="black" points="1060,-517 1060,-540 1154,-540 1154,-517 1060,-517"/>
<text text-anchor="start" x="1066" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[7] qr&#45;622abba5&#45;e2</text>
<polygon fill="#909090" stroke="none" points="1159,-517 1159,-540 1253,-540 1253,-517 1159,-517"/>
<polygon fill="none" stroke="black" points="1159,-517 1159,-540 1253,-540 1253,-517 1159,-517"/>
<text text-anchor="start" x="1165" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[5] tapd6f091a2&#45;c0</text>
<polygon fill="#909090" stroke="none" points="1258,-517 1258,-540 1355,-540 1355,-517 1258,-517"/>
<polygon fill="none" stroke="black" points="1258,-517 1258,-540 1355,-540 1355,-517 1258,-517"/>
<text text-anchor="start" x="1264" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[13] qr&#45;361be2af&#45;e5</text>
<polygon fill="#909090" stroke="none" points="1360,-517 1360,-540 1454,-540 1454,-517 1360,-517"/>
<polygon fill="none" stroke="black" points="1360,-517 1360,-540 1454,-540 1454,-517 1360,-517"/>
<text text-anchor="start" x="1366" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[5] tapd6f091a2&#45;c0</text>
<polygon fill="#909090" stroke="none" points="1459,-517 1459,-540 1558,-540 1558,-517 1459,-517"/>
<polygon fill="none" stroke="black" points="1459,-517 1459,-540 1558,-540 1558,-517 1459,-517"/>
<text text-anchor="start" x="1465" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[14] qr&#45;b66b902a&#45;36</text>
<polygon fill="#909090" stroke="none" points="1563,-517 1563,-540 1657,-540 1657,-517 1563,-517"/>
<polygon fill="none" stroke="black" points="1563,-517 1563,-540 1657,-540 1657,-517 1563,-517"/>
<text text-anchor="start" x="1569" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[6] tapd0828ef0&#45;eb</text>
<polygon fill="#909090" stroke="none" points="861,-489 861,-512 956,-512 956,-489 861,-489"/>
<polygon fill="none" stroke="black" points="861,-489 861,-512 956,-512 956,-489 861,-489"/>
<text text-anchor="start" x="882.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#909090" stroke="none" points="961,-489 961,-512 1055,-512 1055,-489 961,-489"/>
<polygon fill="none" stroke="black" points="961,-489 961,-512 1055,-512 1055,-489 961,-489"/>
<text text-anchor="start" x="982" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#909090" stroke="none" points="1060,-489 1060,-512 1154,-512 1154,-489 1060,-489"/>
<polygon fill="none" stroke="black" points="1060,-489 1060,-512 1154,-512 1154,-489 1060,-489"/>
<text text-anchor="start" x="1081" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#909090" stroke="none" points="1159,-489 1159,-512 1253,-512 1253,-489 1159,-489"/>
<polygon fill="none" stroke="black" points="1159,-489 1159,-512 1253,-512 1253,-489 1159,-489"/>
<text text-anchor="start" x="1180" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#909090" stroke="none" points="1258,-489 1258,-512 1355,-512 1355,-489 1258,-489"/>
<polygon fill="none" stroke="black" points="1258,-489 1258,-512 1355,-512 1355,-489 1258,-489"/>
<text text-anchor="start" x="1280.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#909090" stroke="none" points="1360,-489 1360,-512 1454,-512 1454,-489 1360,-489"/>
<polygon fill="none" stroke="black" points="1360,-489 1360,-512 1454,-512 1454,-489 1360,-489"/>
<text text-anchor="start" x="1381" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#909090" stroke="none" points="1459,-489 1459,-512 1558,-512 1558,-489 1459,-489"/>
<polygon fill="none" stroke="black" points="1459,-489 1459,-512 1558,-512 1558,-489 1459,-489"/>
<text text-anchor="start" x="1482.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#909090" stroke="none" points="1563,-489 1563,-512 1657,-512 1657,-489 1563,-489"/>
<polygon fill="none" stroke="black" points="1563,-489 1563,-512 1657,-512 1657,-489 1563,-489"/>
<text text-anchor="start" x="1584" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#909090" stroke="none" points="861,-461 861,-484 956,-484 956,-461 861,-461"/>
<polygon fill="none" stroke="black" points="861,-461 861,-484 956,-484 956,-461 861,-461"/>
<text text-anchor="start" x="884" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.1/24</text>
<polygon fill="#909090" stroke="none" points="961,-461 961,-484 1055,-484 1055,-461 961,-461"/>
<polygon fill="none" stroke="black" points="961,-461 961,-484 1055,-484 1055,-461 961,-461"/>
<text text-anchor="start" x="983.5" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.2/24</text>
<polygon fill="#909090" stroke="none" points="1060,-461 1060,-484 1154,-484 1154,-461 1060,-461"/>
<polygon fill="none" stroke="black" points="1060,-461 1060,-484 1154,-484 1154,-461 1060,-461"/>
<text text-anchor="start" x="1082.5" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.1/24</text>
<polygon fill="#909090" stroke="none" points="1159,-461 1159,-484 1253,-484 1253,-461 1159,-461"/>
<polygon fill="none" stroke="black" points="1159,-461 1159,-484 1253,-484 1253,-461 1159,-461"/>
<text text-anchor="start" x="1181.5" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.2/24</text>
<polygon fill="#909090" stroke="none" points="1258,-461 1258,-484 1355,-484 1355,-461 1258,-461"/>
<polygon fill="none" stroke="black" points="1258,-461 1258,-484 1355,-484 1355,-461 1258,-461"/>
<text text-anchor="start" x="1282" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.5/24</text>
<polygon fill="#909090" stroke="none" points="1360,-461 1360,-484 1454,-484 1454,-461 1360,-461"/>
<polygon fill="none" stroke="black" points="1360,-461 1360,-484 1454,-484 1454,-461 1360,-461"/>
<text text-anchor="start" x="1382.5" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.2/24</text>
<polygon fill="#909090" stroke="none" points="1459,-461 1459,-484 1558,-484 1558,-461 1459,-461"/>
<polygon fill="none" stroke="black" points="1459,-461 1459,-484 1558,-484 1558,-461 1459,-461"/>
<text text-anchor="start" x="1484" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.5/24</text>
<polygon fill="#909090" stroke="none" points="1563,-461 1563,-484 1657,-484 1657,-461 1563,-461"/>
<polygon fill="none" stroke="black" points="1563,-461 1563,-484 1657,-484 1657,-461 1563,-461"/>
<text text-anchor="start" x="1585.5" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.2/24</text>
<polygon fill="#909090" stroke="none" points="861,-433 861,-456 1055,-456 1055,-433 861,-433"/>
<polygon fill="none" stroke="black" points="861,-433 861,-456 1055,-456 1055,-433 861,-433"/>
<text text-anchor="start" x="940.5" y="-442" font-family="Helvetica,sans-Serif" font-size="10.00">private2</text>
<polygon fill="#909090" stroke="none" points="1060,-433 1060,-456 1253,-456 1253,-433 1060,-433"/>
<polygon fill="none" stroke="black" points="1060,-433 1060,-456 1253,-456 1253,-433 1060,-433"/>
<text text-anchor="start" x="1139" y="-442" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#909090" stroke="none" points="1258,-433 1258,-456 1454,-456 1454,-433 1258,-433"/>
<polygon fill="none" stroke="black" points="1258,-433 1258,-456 1454,-456 1454,-433 1258,-433"/>
<text text-anchor="start" x="1338.5" y="-442" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#909090" stroke="none" points="1459,-433 1459,-456 1657,-456 1657,-433 1459,-433"/>
<polygon fill="none" stroke="black" points="1459,-433 1459,-456 1657,-456 1657,-433 1459,-433"/>
<text text-anchor="start" x="1540.5" y="-442" font-family="Helvetica,sans-Serif" font-size="10.00">private2</text>
<polygon fill="#909090" stroke="none" points="861,-405 861,-428 1253,-428 1253,-405 861,-405"/>
<polygon fill="none" stroke="black" points="861,-405 861,-428 1253,-428 1253,-405 861,-405"/>
<text text-anchor="start" x="1041.5" y="-414" font-family="Helvetica,sans-Serif" font-size="10.00">router1</text>
<polygon fill="#909090" stroke="none" points="1258,-405 1258,-428 1657,-428 1657,-405 1258,-405"/>
<polygon fill="none" stroke="black" points="1258,-405 1258,-428 1657,-428 1657,-405 1258,-405"/>
<text text-anchor="start" x="1442" y="-414" font-family="Helvetica,sans-Serif" font-size="10.00">router2</text>
<polygon fill="#909090" stroke="none" points="861,-377 861,-400 1657,-400 1657,-377 861,-377"/>
<polygon fill="none" stroke="black" points="861,-377 861,-400 1657,-400 1657,-377 861,-377"/>
<text text-anchor="start" x="1231.5" y="-386" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;tun</text>
</g>
<!-- br_ex&#45;&gt;network_br_int -->
<g id="edge19" class="edge"><title>br_ex:qg_e2b1b0d3_a8:s&#45;&gt;network_br_int:qr_361be2af_e5:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M1257,-656C1257,-600.267 1307,-596.733 1307,-541"/>
</g>
<!-- br_ex&#45;&gt;network_br_int -->
<g id="edge20" class="edge"><title>br_ex:qg_e2b1b0d3_a8:s&#45;&gt;network_br_int:qr_b66b902a_36:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M1257,-656C1257,-532.889 1509,-664.111 1509,-541"/>
</g>
<!-- br_ex&#45;&gt;network_br_int -->
<g id="edge21" class="edge"><title>br_ex:qg_eb8796fb_83:s&#45;&gt;network_br_int:qr_09a15e37_ca:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M1156,-656C1156,-534.504 908,-662.496 908,-541"/>
</g>
<!-- br_ex&#45;&gt;network_br_int -->
<g id="edge22" class="edge"><title>br_ex:qg_eb8796fb_83:s&#45;&gt;network_br_int:qr_622abba5_e2:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M1156,-656C1156,-600.443 1107,-596.557 1107,-541"/>
</g>
<!-- network_br_tun -->
<g id="node9" class="node"><title>network_br_tun</title>
<polygon fill="white" stroke="none" points="1205.5,-204 1205.5,-264 1310.5,-264 1310.5,-204 1205.5,-204"/>
<polygon fill="white" stroke="none" points="1211,-237 1211,-259 1306,-259 1306,-237 1211,-237"/>
<text text-anchor="start" x="1232.5" y="-245.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_tun</text>
<polygon fill="#909090" stroke="none" points="1211,-209 1211,-232 1306,-232 1306,-209 1211,-209"/>
<polygon fill="none" stroke="black" points="1211,-209 1211,-232 1306,-232 1306,-209 1211,-209"/>
<text text-anchor="start" x="1232.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;int</text>
</g>
<!-- network_br_int&#45;&gt;network_br_tun -->
<g id="edge18" class="edge"><title>network_br_int:patch_tun:s&#45;&gt;network_br_tun:patch_int:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M1259,-376C1259,-312.444 1259,-296.556 1259,-233"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 40 KiB

View File

@ -0,0 +1,31 @@
<!DOCTYPE html>
<html>
<head>
<title>DON: Internal View</title>
<link rel="stylesheet" type="text/css" href="don.css">
</head>
<body>
<div id="internal">
<table width="100%">
<th class="title">
DON: Internal View
</th>
<tr>
<td align="center" class="clickme">
<button class="myButton"
onClick="location.href='http://127.0.0.1:8000/don/analyze'">
Analyze</button>
&nbsp;&nbsp;&nbsp;
<button class="myButton"
onClick="location.href='http://127.0.0.1:8000/don/ping'">
Ping Tracer</button>
</td>
</tr>
<tr>
<td><object class="emb" data="don.svg" width="100%" height="850" type="image/svg+xml" id="don_svg"></object></td>
</tr>
</table>
</div>
</body>
</html>

View File

@ -0,0 +1,36 @@
from horizon import tables
from django.utils.translation import ugettext_lazy as _
from django.core.urlresolvers import reverse
from don import api
from django.utils.http import urlencode
class ViewCollection(tables.LinkAction):
name = 'view'
verbose_name = _('View')
def get_link_url(self, datum):
base_url = reverse('horizon:don:archive:dbview')
params = urlencode({"id": self.table.get_object_id(datum)})
return "?".join([base_url, params])
class DeleteCollection(tables.DeleteAction):
name = 'delete'
verbose_name = _('Delete')
data_type_singular = _('Collection')
def delete(self, request, obj_id):
return api.remove_collection(request, obj_id)
class CollectionTable(tables.DataTable):
name = tables.Column('timestamp', verbose_name=_('Generated Time'))
def get_object_id(self, datum):
return datum['id']
class Meta:
# table_actions = (,)
row_actions = (ViewCollection, DeleteCollection,)
name = 'collection'

View File

@ -0,0 +1,11 @@
{% extends 'base.html' %}
{% block sidebar %}
{% include 'horizon/common/_sidebar.html' %}
{% endblock %}
{% block main %}
{% include "horizon/_messages.html" %}
{% block mydashboard_main %}{% endblock %}
{% endblock %}

View File

@ -0,0 +1,93 @@
<!DOCTYPE html>
<html>
<head>
<title>DON: Diagnosing OpenStack Networking</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
<script>
$(document).ready(function() {
var $loading = $('#inprogress').hide();
function get_status(){
console.log('getting status')
var status = $.ajax({
type:"GET",
url: '/dashboard/don/status',
// async: false,
success: function(data){
console.log('success')
$("#content .value").html(data.status);
}
});
}
$loading.hide();
$('.collect').click(function(){
$.ajax({
type: "GET",
url: "/horizon/don/collect",
beforeSend: function(){
$loading.show();
$("#content .value").html("");
$loading.attr('style','block');
poll = setInterval(function(){get_status();}, 1000);
},
success: function(data) {
$loading.hide();
console.log(data.collect_status)
clearInterval(poll);
$("#content .value").html(data.collect_status);
},
error: function(data){
clearInterval(poll);
$("#content .value").html("Error while collecting data..");
$("#loading_img").hide();
}
});
});
});
</script>
</head>
<body>
<div id="main">
<table width="100%" border-spacing="10px">
<th class="title">
DON: Diagnosing OpenStack Networking
</th>
<tr>
<td><BR>
<span class="label label-primary">Step 1</span> Collect <nbsp>
<span class="label label-primary">Step 2</span> Visualize <nbsp>
<span class="label label-primary">Step 3</span> Analyze or Ping Trace <nbsp></td>
</tr>
<tr>
<td align="right" class="table_header">
<button class="btn btn-default collect"><span class="fa fa-download"></span> Collect</button>
<button class="btn btn-default btn-sm ajax-modal btn-launch ajax-update"
onClick="location.href='/dashboard/don/view'"><span class="fa fa-pencil"></span>
Visualize</button>
</td>
</tr>
<tr>
<!-- Showing loading icon and collection status -->
<td align="center">
<BR><BR><BR>
<div class="alert alert-dismissable alert-info" id="inprogress" style="display: none; width:30%;" >
<!-- <h5>{{collect_status}}</h5> -->
<img id='loading_img' src='{{STATIC_URL}}don/loading_dots.gif' /><BR>
<p> Collecting Data </p>
<div id='content'>
<strong><p class='value'>{{collect_status}}</p></strong>
</div>
</div>
</td>
</tr>
</table>
</div>
</body>
</html>

View File

@ -0,0 +1,144 @@
<html>
<head>
<script type="text/javascript" src="{{ STATIC_URL }}/don/CollapsibleLists.js"></script>
<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}/don/don.css">
<title>DON: Analysis Results</title>
</head>
<body onload=CollapsibleLists.apply()>
<h2>OVS Test Results</h2>
<h3>OVS test between all pairs of ports using the same tag in br-int</h3>
<ul class="collapsibleList">
<li>OVS bridge br-int
<ul class="collapsibleList">
<li>tag 2
<ul class="collapsibleList">
<li> 6 &rarr; 7 <font class="fail">&#10008;</font>
<ul class="collapsibleList">
<pre class="fail">
'sudo ovs-appctl fdb/flush br-int'
'sudo ovs-appctl ofproto/trace br-int in_port=6,dl_src=AA:BB:CC:DD:EE:11,dl_dst=AA:BB:CC:DD:EE:22 -generate'
'sudo ovs-appctl fdb/show br-int'
'sudo ovs-appctl ofproto/trace br-int in_port=7,dl_src=AA:BB:CC:DD:EE:22,dl_dst=AA:BB:CC:DD:EE:11 -generate'
{
"command_list": [
{
"cmd": "sudo ovs-appctl fdb/flush br-int",
"output": [
"table successfully flushed",
""
]
},
{
"cmd": "sudo ovs-appctl ofproto/trace br-int in_port=6,dl_src=AA:BB:CC:DD:EE:11,dl_dst=AA:BB:CC:DD:EE:22 -generate",
"output": [
"Flow: metadata=0,in_port=6,vlan_tci=0x0000,dl_src=aa:bb:cc:dd:ee:11,dl_dst=aa:bb:cc:dd:ee:22,dl_type=0x0000",
"Rule: table=0 cookie=0x9ddbfd9c4f252cdc priority=0",
"OpenFlow actions=NORMAL",
"no learned MAC for destination, flooding",
"",
" Resubmitted flow: metadata=0,in_port=1,dl_vlan=2,dl_vlan_pcp=0,dl_src=aa:bb:cc:dd:ee:11,dl_dst=aa:bb:cc:dd:ee:22,dl_type=0x0000",
" Resubmitted regs: reg0=0x0 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0",
" Resubmitted odp: push_vlan(vid=2,pcp=0),6,5,pop_vlan,8,9,push_vlan(vid=2,pcp=0),10",
" Rule: table=0 cookie=0x9ddbfd9c4f252cdc priority=1,in_port=1",
" OpenFlow actions=resubmit(,2)",
"",
" Resubmitted flow: unchanged",
" Resubmitted regs: reg0=0x0 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0",
" Resubmitted odp: push_vlan(vid=2,pcp=0),6,5,pop_vlan,8,9,push_vlan(vid=2,pcp=0),10",
" Rule: table=2 cookie=0x9ddbfd9c4f252cdc priority=0,dl_dst=00:00:00:00:00:00/01:00:00:00:00:00",
" OpenFlow actions=resubmit(,20)",
"",
" Resubmitted flow: unchanged",
" Resubmitted regs: reg0=0x0 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0",
" Resubmitted odp: push_vlan(vid=2,pcp=0),6,5,pop_vlan,8,9,push_vlan(vid=2,pcp=0),10",
" Rule: table=20 cookie=0x9ddbfd9c4f252cdc priority=0",
" OpenFlow actions=resubmit(,22)",
"",
" Resubmitted flow: unchanged",
" Resubmitted regs: reg0=0x0 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0",
" Resubmitted odp: push_vlan(vid=2,pcp=0),6,5,pop_vlan,8,9,push_vlan(vid=2,pcp=0),10",
" Rule: table=22 cookie=0x9ddbfd9c4f252cdc priority=0",
" OpenFlow actions=drop",
"",
"Final flow: metadata=0,in_port=6,vlan_tci=0x0000,dl_src=aa:bb:cc:dd:ee:11,dl_dst=aa:bb:cc:dd:ee:22,dl_type=0x0000",
"Relevant fields: skb_priority=0,in_port=6,vlan_tci=0x0000,dl_src=aa:bb:cc:dd:ee:11,dl_dst=aa:bb:cc:dd:ee:22,dl_type=0x0000,nw_proto=0,nw_frag=no,tp_src=0",
"Datapath actions: push_vlan(vid=2,pcp=0),6,5,pop_vlan,8,9,push_vlan(vid=2,pcp=0),10,pop_vlan,14",
""
]
},
{
"cmd": "sudo ovs-appctl fdb/show br-int",
"output": [
" port VLAN MAC Age",
" 6 2 aa:bb:cc:dd:ee:11 0",
""
]
},
{
"cmd": "sudo ovs-appctl ofproto/trace br-int in_port=7,dl_src=AA:BB:CC:DD:EE:22,dl_dst=AA:BB:CC:DD:EE:11 -generate",
"output": [
"Flow: metadata=0,in_port=7,vlan_tci=0x0000,dl_src=aa:bb:cc:dd:ee:22,dl_dst=aa:bb:cc:dd:ee:11,dl_type=0x0000",
"Rule: table=0 cookie=0x9ddbfd9c4f252cdc priority=0",
"OpenFlow actions=NORMAL",
"forwarding to learned port",
"",
"Final flow: unchanged",
"Relevant fields: skb_priority=0,in_port=7,vlan_tci=0x0000/0x1fff,dl_src=aa:bb:cc:dd:ee:22,dl_dst=aa:bb:cc:dd:ee:11,dl_type=0x0000,nw_proto=0,nw_frag=no,tp_src=0",
"Datapath actions: 13",
""
]
}
],
"comment": "ovs br-int port 6 --> 7",
"debugs": [
"AA:BB:CC:DD:EE:11 learnt on expected vlan 2 on port 6",
"Packet for learnt mac forwarded properly"
],
"errors": [
"Packet forwarded to incorrect port 13, expected 6"
],
"pass": false
}
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
OVERALL RESULT: <font class="fail">&#10008;</font>
<h2>Ping Test Results</h2>
<h3>Ping test between all pairs of VMs</h3>
<ul class="collapsibleList">
<li>router1 (Namespace [qrouter-90111551-6cfc-4be0-b1c2-ce8bffb7edf6])
<ul class="collapsibleList">
<li>vm1 &rarr; vm2
<ul class="collapsibleList">
<li> 10.10.0.3 &rarr; 10.10.0.4 <font class="fail">&#10008;</font>
<ul class="collapsibleList">
<pre class="fail">
{
"command_list": [
{
"cmd": "ssh 10.10.0.3 with provided username and passwd",
"output": "Could not ssh to 10.10.0.3",
"pass": false
}
],
"comment": "PING 10.10.0.3 to 10.10.0.4",
"errors": [],
"pass": false
}
</pre>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
OVERALL RESULT: <font class="fail">&#10008;</font>
</body>
</html>

View File

@ -0,0 +1,204 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.36.0 (20140111.2315)
-->
<!-- Title: DON_DON Pages: 1 -->
<svg width="576pt" height="720pt"
viewBox="0.00 0.00 576.00 720.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 716)">
<title>DON_DON</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-716 572,-716 572,4 -4,4"/>
<g id="clust1" class="cluster"><title>cluster_DONComputeNode</title>
<polygon fill="lightgrey" stroke="black" points="8,-8 8,-704 286,-704 286,-8 8,-8"/>
</g>
<g id="clust2" class="cluster"><title>cluster_ComputeNode</title>
<polygon fill="lightgrey" stroke="black" points="133,-640 133,-696 253,-696 253,-640 133,-640"/>
</g>
<g id="clust3" class="cluster"><title>cluster_Nova</title>
<polygon fill="lightgrey" stroke="black" points="16,-436 16,-592 278,-592 278,-436 16,-436"/>
</g>
<g id="clust4" class="cluster"><title>cluster_VMs</title>
<polygon fill="lightgrey" stroke="black" points="116,-444 116,-584 270,-584 270,-444 116,-444"/>
</g>
<g id="clust5" class="cluster"><title>cluster_LinuxBridge</title>
<polygon fill="lightgrey" stroke="black" points="24,-488 24,-540 108,-540 108,-488 24,-488"/>
</g>
<g id="clust6" class="cluster"><title>cluster_OVS</title>
<polygon fill="lightgrey" stroke="black" points="16,-16 16,-354 274,-354 274,-16 16,-16"/>
</g>
<g id="clust7" class="cluster"><title>cluster_compute_br_int</title>
<polygon fill="lightgrey" stroke="black" points="24,-206 24,-346 266,-346 266,-206 24,-206"/>
</g>
<g id="clust8" class="cluster"><title>cluster_compute_br_tun</title>
<polygon fill="lightgrey" stroke="black" points="89,-24 89,-108 201,-108 201,-24 89,-24"/>
</g>
<g id="clust9" class="cluster"><title>cluster_DONNetworkNode</title>
<polygon fill="lightgrey" stroke="black" points="294,-8 294,-704 560,-704 560,-8 294,-8"/>
</g>
<g id="clust11" class="cluster"><title>cluster_OVS</title>
<polygon fill="lightgrey" stroke="black" points="302,-16 302,-592 552,-592 552,-16 302,-16"/>
</g>
<g id="clust12" class="cluster"><title>cluster_br_ex</title>
<polygon fill="lightgrey" stroke="black" points="310,-444 310,-584 448,-584 448,-444 310,-444"/>
</g>
<g id="clust13" class="cluster"><title>cluster_network_br_int</title>
<polygon fill="lightgrey" stroke="black" points="310,-164 310,-388 544,-388 544,-164 310,-164"/>
</g>
<g id="clust14" class="cluster"><title>cluster_network_br_tun</title>
<polygon fill="lightgrey" stroke="black" points="372,-24 372,-108 484,-108 484,-24 372,-24"/>
</g>
<g id="clust10" class="cluster"><title>cluster_NetworkNode</title>
<polygon fill="lightgrey" stroke="black" points="320,-640 320,-696 438,-696 438,-640 320,-640"/>
</g>
<!-- ComputeNode -->
<g id="node1" class="node"><title>ComputeNode</title>
<polygon fill="red" stroke="none" points="149,-652 149,-684 237,-684 237,-652 149,-652"/>
<polygon fill="yellow" stroke="none" points="154,-657 154,-679 232,-679 232,-657 154,-657"/>
<text text-anchor="start" x="159.5" y="-665.5" font-family="Helvetica,sans-Serif" font-size="10.00">Compute Node</text>
</g>
<!-- VMs -->
<g id="node2" class="node"><title>VMs</title>
<polygon fill="white" stroke="none" points="132,-456 132,-572 254,-572 254,-456 132,-456"/>
<polygon fill="white" stroke="none" points="137,-545 137,-567 249,-567 249,-545 137,-545"/>
<text text-anchor="start" x="182.5" y="-553.5" font-family="Helvetica,sans-Serif" font-size="10.00">VMs</text>
<polygon fill="#ff9933" stroke="none" points="137,-517 137,-540 191,-540 191,-517 137,-517"/>
<polygon fill="none" stroke="black" points="137,-517 137,-540 191,-540 191,-517 137,-517"/>
<text text-anchor="start" x="154.5" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">vm1</text>
<polygon fill="#ff9933" stroke="none" points="196,-517 196,-540 249,-540 249,-517 196,-517"/>
<polygon fill="none" stroke="black" points="196,-517 196,-540 249,-540 249,-517 196,-517"/>
<text text-anchor="start" x="213" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">vm2</text>
<polygon fill="#c079f3" stroke="none" points="137,-489 137,-512 191,-512 191,-489 137,-489"/>
<polygon fill="none" stroke="black" points="137,-489 137,-512 191,-512 191,-489 137,-489"/>
<text text-anchor="start" x="146.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#c079f3" stroke="none" points="196,-489 196,-512 249,-512 249,-489 196,-489"/>
<polygon fill="none" stroke="black" points="196,-489 196,-512 249,-512 249,-489 196,-489"/>
<text text-anchor="start" x="205" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#c079f3" stroke="none" points="137,-461 137,-484 191,-484 191,-461 137,-461"/>
<polygon fill="none" stroke="black" points="137,-461 137,-484 191,-484 191,-461 137,-461"/>
<text text-anchor="start" x="143.5" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.3</text>
<polygon fill="#c079f3" stroke="none" points="196,-461 196,-484 249,-484 249,-461 196,-461"/>
<polygon fill="none" stroke="black" points="196,-461 196,-484 249,-484 249,-461 196,-461"/>
<text text-anchor="start" x="202" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.4</text>
</g>
<!-- ComputeNode&#45;&gt;VMs -->
<!-- LinuxBridge -->
<g id="node3" class="node"><title>LinuxBridge</title>
<text text-anchor="middle" x="66" y="-511.5" font-family="Helvetica,sans-Serif" font-size="10.00">LinuxBridge</text>
</g>
<!-- compute_br_int -->
<g id="node4" class="node"><title>compute_br_int</title>
<polygon fill="white" stroke="none" points="40,-218 40,-334 250,-334 250,-218 40,-218"/>
<polygon fill="white" stroke="none" points="45,-307 45,-329 245,-329 245,-307 45,-307"/>
<text text-anchor="start" x="120.5" y="-315.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_int</text>
<polygon fill="#c079f3" stroke="none" points="45,-279 45,-302 144,-302 144,-279 45,-279"/>
<polygon fill="none" stroke="black" points="45,-279 45,-302 144,-302 144,-279 45,-279"/>
<text text-anchor="start" x="51.5" y="-288" font-family="Helvetica,sans-Serif" font-size="10.00">[6] qvo8aa60600&#45;7b</text>
<polygon fill="#c079f3" stroke="none" points="149,-279 149,-302 245,-302 245,-279 149,-279"/>
<polygon fill="none" stroke="black" points="149,-279 149,-302 245,-302 245,-279 149,-279"/>
<text text-anchor="start" x="155" y="-288" font-family="Helvetica,sans-Serif" font-size="10.00">[7] qvo71ac5bef&#45;7c</text>
<polygon fill="#c079f3" stroke="none" points="45,-251 45,-274 144,-274 144,-251 45,-251"/>
<polygon fill="none" stroke="black" points="45,-251 45,-274 144,-274 144,-251 45,-251"/>
<text text-anchor="start" x="68.5" y="-260" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="149,-251 149,-274 245,-274 245,-251 149,-251"/>
<polygon fill="none" stroke="black" points="149,-251 149,-274 245,-274 245,-251 149,-251"/>
<text text-anchor="start" x="171" y="-260" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#ffcc00" stroke="none" points="45,-223 45,-246 245,-246 245,-223 45,-223"/>
<polygon fill="none" stroke="black" points="45,-223 45,-246 245,-246 245,-223 45,-223"/>
<text text-anchor="start" x="117.5" y="-232" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;tun</text>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge2" class="edge"><title>LinuxBridge:qvb8aa60600_7b:s&#45;&gt;compute_br_int:qvo8aa60600_7b:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M69.8346,-495.954C77.5031,-460.323 94,-375.275 94,-303"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge3" class="edge"><title>LinuxBridge:qvb71ac5bef_7c:s&#45;&gt;compute_br_int:qvo71ac5bef_7c:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M76.0841,-495.784C85.3069,-480.12 99.3923,-456.399 112,-436 148.882,-376.326 197,-373.152 197,-303"/>
</g>
<!-- compute_br_tun -->
<g id="node5" class="node"><title>compute_br_tun</title>
<polygon fill="white" stroke="none" points="105,-36 105,-96 185,-96 185,-36 105,-36"/>
<polygon fill="white" stroke="none" points="110,-69 110,-91 180,-91 180,-69 110,-69"/>
<text text-anchor="start" x="119" y="-77.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_tun</text>
<polygon fill="#ffcc00" stroke="none" points="110,-41 110,-64 180,-64 180,-41 110,-41"/>
<polygon fill="none" stroke="black" points="110,-41 110,-64 180,-64 180,-41 110,-41"/>
<text text-anchor="start" x="119" y="-50" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;int</text>
</g>
<!-- compute_br_int&#45;&gt;compute_br_tun -->
<g id="edge4" class="edge"><title>compute_br_int:patch_tun:s&#45;&gt;compute_br_tun:patch_int:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M145,-222C145,-152.222 145,-134.778 145,-65"/>
</g>
<!-- NetworkNode -->
<g id="node6" class="node"><title>NetworkNode</title>
<polygon fill="red" stroke="none" points="336.5,-652 336.5,-684 421.5,-684 421.5,-652 336.5,-652"/>
<polygon fill="yellow" stroke="none" points="342,-657 342,-679 417,-679 417,-657 342,-657"/>
<text text-anchor="start" x="347.5" y="-665.5" font-family="Helvetica,sans-Serif" font-size="10.00">Network Node</text>
</g>
<!-- br_ex -->
<g id="node7" class="node"><title>br_ex</title>
<polygon fill="white" stroke="none" points="326.5,-456 326.5,-572 431.5,-572 431.5,-456 326.5,-456"/>
<polygon fill="white" stroke="none" points="332,-545 332,-567 427,-567 427,-545 332,-545"/>
<text text-anchor="start" x="355" y="-553.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_ex</text>
<polygon fill="#ff9933" stroke="none" points="332,-517 332,-540 427,-540 427,-517 332,-517"/>
<polygon fill="none" stroke="black" points="332,-517 332,-540 427,-540 427,-517 332,-517"/>
<text text-anchor="start" x="364" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">router1</text>
<polygon fill="#ff9933" stroke="none" points="332,-489 332,-512 427,-512 427,-489 332,-489"/>
<polygon fill="none" stroke="black" points="332,-489 332,-512 427,-512 427,-489 332,-489"/>
<text text-anchor="start" x="349.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">172.24.4.3/24</text>
<polygon fill="#ff9933" stroke="none" points="332,-461 332,-484 427,-484 427,-461 332,-461"/>
<polygon fill="none" stroke="black" points="332,-461 332,-484 427,-484 427,-461 332,-461"/>
<text text-anchor="start" x="338.5" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">[2] qg&#45;757bf552&#45;73</text>
</g>
<!-- NetworkNode&#45;&gt;br_ex -->
<!-- network_br_int -->
<g id="node8" class="node"><title>network_br_int</title>
<polygon fill="white" stroke="none" points="326.5,-176 326.5,-376 527.5,-376 527.5,-176 326.5,-176"/>
<polygon fill="white" stroke="none" points="332,-349 332,-371 523,-371 523,-349 332,-349"/>
<text text-anchor="start" x="403" y="-357.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_int</text>
<polygon fill="#c079f3" stroke="none" points="332,-321 332,-344 427,-344 427,-321 332,-321"/>
<polygon fill="none" stroke="black" points="332,-321 332,-344 427,-344 427,-321 332,-321"/>
<text text-anchor="start" x="338.5" y="-330" font-family="Helvetica,sans-Serif" font-size="10.00">[8] qr&#45;43b83157&#45;3b</text>
<polygon fill="#c079f3" stroke="none" points="432,-321 432,-344 523,-344 523,-321 432,-321"/>
<polygon fill="none" stroke="black" points="432,-321 432,-344 523,-344 523,-321 432,-321"/>
<text text-anchor="start" x="438" y="-330" font-family="Helvetica,sans-Serif" font-size="10.00">[5] tap59f90a3b&#45;f5</text>
<polygon fill="#c079f3" stroke="none" points="332,-293 332,-316 427,-316 427,-293 332,-293"/>
<polygon fill="none" stroke="black" points="332,-293 332,-316 427,-316 427,-293 332,-293"/>
<text text-anchor="start" x="353.5" y="-302" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="432,-293 432,-316 523,-316 523,-293 432,-293"/>
<polygon fill="none" stroke="black" points="432,-293 432,-316 523,-316 523,-293 432,-293"/>
<text text-anchor="start" x="451.5" y="-302" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="332,-265 332,-288 427,-288 427,-265 332,-265"/>
<polygon fill="none" stroke="black" points="332,-265 332,-288 427,-288 427,-265 332,-265"/>
<text text-anchor="start" x="352" y="-274" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.1/24</text>
<polygon fill="#c079f3" stroke="none" points="432,-265 432,-288 523,-288 523,-265 432,-265"/>
<polygon fill="none" stroke="black" points="432,-265 432,-288 523,-288 523,-265 432,-265"/>
<text text-anchor="start" x="450" y="-274" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.2/24</text>
<polygon fill="#c079f3" stroke="none" points="332,-237 332,-260 523,-260 523,-237 332,-237"/>
<polygon fill="none" stroke="black" points="332,-237 332,-260 523,-260 523,-237 332,-237"/>
<text text-anchor="start" x="410" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#ff9933" stroke="none" points="332,-209 332,-232 523,-232 523,-209 332,-209"/>
<polygon fill="none" stroke="black" points="332,-209 332,-232 523,-232 523,-209 332,-209"/>
<text text-anchor="start" x="412" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">router1</text>
<polygon fill="#ffcc00" stroke="none" points="332,-181 332,-204 523,-204 523,-181 332,-181"/>
<polygon fill="none" stroke="black" points="332,-181 332,-204 523,-204 523,-181 332,-181"/>
<text text-anchor="start" x="400" y="-190" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;tun</text>
</g>
<!-- br_ex&#45;&gt;network_br_int -->
<g id="edge7" class="edge"><title>br_ex:qg_757bf552_73:s&#45;&gt;network_br_int:qr_43b83157_3b:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M380,-460C380,-408.887 379,-396.113 379,-345"/>
</g>
<!-- network_br_tun -->
<g id="node9" class="node"><title>network_br_tun</title>
<polygon fill="white" stroke="none" points="388,-36 388,-96 468,-96 468,-36 388,-36"/>
<polygon fill="white" stroke="none" points="393,-69 393,-91 463,-91 463,-69 393,-69"/>
<text text-anchor="start" x="402" y="-77.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_tun</text>
<polygon fill="#ffcc00" stroke="none" points="393,-41 393,-64 463,-64 463,-41 393,-41"/>
<polygon fill="none" stroke="black" points="393,-41 393,-64 463,-64 463,-41 393,-41"/>
<text text-anchor="start" x="402" y="-50" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;int</text>
</g>
<!-- network_br_int&#45;&gt;network_br_tun -->
<g id="edge6" class="edge"><title>network_br_int:patch_tun:s&#45;&gt;network_br_tun:patch_int:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M428,-180C428,-128.889 428,-116.111 428,-65"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -0,0 +1,27 @@
<!DOCTYPE html>
<html>
<head>
<title>DON: Ping Tracer</title>
<link rel="stylesheet" type="text/css" href="don.css">
</head>
<body>
<div id="internal">
<table width="100%">
<th class="title">
DON: Ping Tracer
</th>
<tr>
<td align="right" class="clickme">
<button class="btn btn-default btn-sm ajax-modal btn-launch ajax-update"
onClick="history.go(-1)">
Back</button>
</td>
</tr>
<tr>
<td><object class="emb" data="{{STATIC_URL}}don/ping.svg" width="100%" height="850" type="image/svg+xml" id="ping_svg"></object></td>
</tr>
</table>
</div>
</body>
</html>

View File

@ -0,0 +1,14 @@
<div class="col-lg-4">
<div class="well bs-component">
<form action="/dashboard/don/ping/" method="post">
<fieldset>
{% csrf_token %}
<legend>DON: Ping Tracer</legend>
<div class="form-group required">
{{ form }}
</div>
<input class="btn btn-primary ajax-update" type="submit" value="Submit" />
</fieldset>
</form>
</div>
</div>

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

View File

@ -0,0 +1,47 @@
<!DOCTYPE html>
<html>
<head>
<title>DON: Internal View</title>
<link rel="stylesheet" type="text/css" href="don.css">
<script type="text/javascript">
function download(){
var a = document.createElement("a");
var now = new Date();
var timestamp = now.toISOString()
a.href = "{{STATIC_URL}}don/don.svg";
a.download = "DON-Internal-View-"+timestamp+".svg";
a.click();
}
</script>
</head>
<body>
<div id="internal">
<table width="100%">
<th class="title">
DON: Internal View
</th>
<tr>
<td align="right" class="table_header">
<button class="btn btn-default btn-sm ajax-modal btn-launch ajax-update"
onClick="location.href='/dashboard/don/analyze'"><span class="fa fa-search"></span>
Analyze</button>
&nbsp;&nbsp;&nbsp;
<button class="btn btn-default btn-sm ajax-modal btn-launch ajax-update"
onClick="location.href='/dashboard/don/ping'">
Ping Tracer</button>
&nbsp;&nbsp;&nbsp;
<button class="btn btn-default btn-sm"
onClick="download();"><span class="fa fa-download"></span>
Download Graph</button>
</td>
</tr>
<tr>
<td><object class="emb" data="{{STATIC_URL}}don/don.svg" width="100%" height="850" type="image/svg+xml" id="don_svg"></object></td>
<!-- <img src='test.png'> -->
</tr>
</table>
</div>
</body>
</html>

View File

@ -0,0 +1,29 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
# The slug of the dashboard to be added to HORIZON['dashboards']. Required.
DASHBOARD = 'don'
# If set to True, this dashboard will be set as the default dashboard.
DEFAULT = False
# A dictionary of exception classes to be added to HORIZON['exceptions'].
ADD_EXCEPTIONS = {}
# A list of applications to be added to INSTALLED_APPS.
ADD_INSTALLED_APPS = ['don']
ADD_ANGULAR_MODULES = [
# 'horizon.dashboard.don',
]
AUTO_DISCOVER_STATIC_FILES = True
# WEBROOT = '/'

View File

@ -3,3 +3,4 @@
# process, which may cause wedges in the gate later.
pbr>=1.6
Django<1.9,>=1.8

View File

@ -0,0 +1,152 @@
/*
CollapsibleLists.js
An object allowing lists to dynamically expand and collapse
Created by Stephen Morley - http://code.stephenmorley.org/ - and released under
the terms of the CC0 1.0 Universal legal code:
http://creativecommons.org/publicdomain/zero/1.0/legalcode
*/
// create the CollapsibleLists object
var CollapsibleLists =
new function(){
/* Makes all lists with the class 'collapsibleList' collapsible. The
* parameter is:
*
* doNotRecurse - true if sub-lists should not be made collapsible
*/
this.apply = function(doNotRecurse){
// loop over the unordered lists
var uls = document.getElementsByTagName('ul');
for (var index = 0; index < uls.length; index ++){
// check whether this list should be made collapsible
if (uls[index].className.match(/(^| )collapsibleList( |$)/)){
// make this list collapsible
this.applyTo(uls[index], true);
// check whether sub-lists should also be made collapsible
if (!doNotRecurse){
// add the collapsibleList class to the sub-lists
var subUls = uls[index].getElementsByTagName('ul');
for (var subIndex = 0; subIndex < subUls.length; subIndex ++){
subUls[subIndex].className += ' collapsibleList';
}
}
}
}
};
/* Makes the specified list collapsible. The parameters are:
*
* node - the list element
* doNotRecurse - true if sub-lists should not be made collapsible
*/
this.applyTo = function(node, doNotRecurse){
// loop over the list items within this node
var lis = node.getElementsByTagName('li');
for (var index = 0; index < lis.length; index ++){
// check whether this list item should be collapsible
if (!doNotRecurse || node == lis[index].parentNode){
// prevent text from being selected unintentionally
if (lis[index].addEventListener){
lis[index].addEventListener(
'mousedown', function (e){ e.preventDefault(); }, false);
}else{
lis[index].attachEvent(
'onselectstart', function(){ event.returnValue = false; });
}
// add the click listener
if (lis[index].addEventListener){
lis[index].addEventListener(
'click', createClickListener(lis[index]), false);
}else{
lis[index].attachEvent(
'onclick', createClickListener(lis[index]));
}
// close the unordered lists within this list item
toggle(lis[index]);
}
}
};
/* Returns a function that toggles the display status of any unordered
* list elements within the specified node. The parameter is:
*
* node - the node containing the unordered list elements
*/
function createClickListener(node){
// return the function
return function(e){
// ensure the event object is defined
if (!e) e = window.event;
// find the list item containing the target of the event
var li = (e.target ? e.target : e.srcElement);
while (li.nodeName != 'LI') li = li.parentNode;
// toggle the state of the node if it was the target of the event
if (li == node) toggle(node);
};
}
/* Opens or closes the unordered list elements directly within the
* specified node. The parameter is:
*
* node - the node containing the unordered list elements
*/
function toggle(node){
// determine whether to open or close the unordered lists
var open = node.className.match(/(^| )collapsibleListClosed( |$)/);
// loop over the unordered list elements with the node
var uls = node.getElementsByTagName('ul');
for (var index = 0; index < uls.length; index ++){
// find the parent list item of this unordered list
var li = uls[index];
while (li.nodeName != 'LI') li = li.parentNode;
// style the unordered list if it is directly within this node
if (li == node) uls[index].style.display = (open ? 'block' : 'none');
}
// remove the current class from the node
node.className =
node.className.replace(
/(^| )collapsibleList(Open|Closed)( |$)/, '');
// if the node contains unordered lists, set its class
if (uls.length > 0){
node.className += ' collapsibleList' + (open ? 'Open' : 'Closed');
}
}
}();

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 B

BIN
static/don/button-open.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 B

BIN
static/don/button.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 B

112
static/don/compute.dot Normal file
View File

@ -0,0 +1,112 @@
digraph DON_compute {
graph [fontsize=10 fontname="Helvetica"];
node [fontsize=10 fontname="Helvetica"];
rankdir = TB;
ranksep = 1;
concentrate = true;
compound = true;
edge [dir=none]
subgraph cluster_ComputeNode {
ComputeNode [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="red">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="yellow" PORT="ComputeNode">Compute Node</TD>
</TR>
</TABLE>>];
}
subgraph cluster_Nova {
style=filled
subgraph cluster_VMs {
VMs [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="VMs">VMs</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933">vm1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933">vm2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3">private1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3">private1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="101003">10.10.0.3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="101004">10.10.0.4</TD>
</TR>
</TABLE>>];
}
subgraph cluster_LinuxBridge {
LinuxBridge [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="LinuxBridge">Linux Bridge</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tap71ac5bef_7c">tap71ac5bef-7c</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qbr8aa60600_7b">qbr8aa60600-7b</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qbr71ac5bef_7c">qbr71ac5bef-7c</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvb8aa60600_7b">qvb8aa60600-7b</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvb71ac5bef_7c">qvb71ac5bef-7c</TD>
</TR>
</TABLE>>];
}
}
subgraph cluster_OVS {
style=filled
subgraph cluster_compute_br_int {
compute_br_int [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_int">OVS br_int</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvo8aa60600_7b">[6] qvo8aa60600-7b</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvo71ac5bef_7c">[7] qvo71ac5bef-7c</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvo8aa60600_7btag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvo71ac5bef_7ctag_2">VLAN tag:2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ffcc00" PORT="patch_tun">[1] patch-tun</TD>
</TR>
</TABLE>>];
}
subgraph cluster_compute_br_tun {
compute_br_tun [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_tun">OVS br_tun</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ffcc00" PORT="patch_int">[1] patch-int</TD>
</TR>
</TABLE>>];
}
}
ComputeNode:s -> VMs:n [color = "#0066cc", penwidth = "4", style="invis"]
VMs:101004:s -> LinuxBridge:tap71ac5bef_7c:n [color = "#0066cc", penwidth = "4"]
LinuxBridge:qvb8aa60600_7b:s -> compute_br_int:qvo8aa60600_7b:n [color = "#0066cc", penwidth = "4"]
LinuxBridge:qvb71ac5bef_7c:s -> compute_br_int:qvo71ac5bef_7c:n [color = "#0066cc", penwidth = "4"]
compute_br_int:patch_tun:s -> compute_br_tun:patch_int:n [color = "#0066cc", penwidth = "4"]
}

132
static/don/compute.svg Normal file
View File

@ -0,0 +1,132 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.36.0 (20140111.2315)
-->
<!-- Title: DON_compute Pages: 1 -->
<svg width="282pt" height="816pt"
viewBox="0.00 0.00 282.00 816.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 812)">
<title>DON_compute</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-812 278,-812 278,4 -4,4"/>
<g id="clust1" class="cluster"><title>cluster_ComputeNode</title>
<polygon fill="none" stroke="black" points="47,-744 47,-800 167,-800 167,-744 47,-744"/>
</g>
<g id="clust2" class="cluster"><title>cluster_Nova</title>
<polygon fill="lightgrey" stroke="black" points="22,-344 22,-696 252,-696 252,-344 22,-344"/>
</g>
<g id="clust3" class="cluster"><title>cluster_VMs</title>
<polygon fill="lightgrey" stroke="black" points="30,-548 30,-688 184,-688 184,-548 30,-548"/>
</g>
<g id="clust4" class="cluster"><title>cluster_LinuxBridge</title>
<polygon fill="lightgrey" stroke="black" points="30,-352 30,-492 244,-492 244,-352 30,-352"/>
</g>
<g id="clust5" class="cluster"><title>cluster_OVS</title>
<polygon fill="lightgrey" stroke="black" points="8,-8 8,-304 266,-304 266,-8 8,-8"/>
</g>
<g id="clust6" class="cluster"><title>cluster_compute_br_int</title>
<polygon fill="lightgrey" stroke="black" points="16,-156 16,-296 258,-296 258,-156 16,-156"/>
</g>
<g id="clust7" class="cluster"><title>cluster_compute_br_tun</title>
<polygon fill="lightgrey" stroke="black" points="81,-16 81,-100 193,-100 193,-16 81,-16"/>
</g>
<!-- ComputeNode -->
<g id="node1" class="node"><title>ComputeNode</title>
<polygon fill="red" stroke="none" points="63,-756 63,-788 151,-788 151,-756 63,-756"/>
<polygon fill="yellow" stroke="none" points="68,-761 68,-783 146,-783 146,-761 68,-761"/>
<text text-anchor="start" x="73.5" y="-769.5" font-family="Helvetica,sans-Serif" font-size="10.00">Compute Node</text>
</g>
<!-- VMs -->
<g id="node2" class="node"><title>VMs</title>
<polygon fill="white" stroke="none" points="46,-560 46,-676 168,-676 168,-560 46,-560"/>
<polygon fill="white" stroke="none" points="51,-649 51,-671 163,-671 163,-649 51,-649"/>
<text text-anchor="start" x="96.5" y="-657.5" font-family="Helvetica,sans-Serif" font-size="10.00">VMs</text>
<polygon fill="#ff9933" stroke="none" points="51,-621 51,-644 105,-644 105,-621 51,-621"/>
<polygon fill="none" stroke="black" points="51,-621 51,-644 105,-644 105,-621 51,-621"/>
<text text-anchor="start" x="68.5" y="-630" font-family="Helvetica,sans-Serif" font-size="10.00">vm1</text>
<polygon fill="#ff9933" stroke="none" points="110,-621 110,-644 163,-644 163,-621 110,-621"/>
<polygon fill="none" stroke="black" points="110,-621 110,-644 163,-644 163,-621 110,-621"/>
<text text-anchor="start" x="127" y="-630" font-family="Helvetica,sans-Serif" font-size="10.00">vm2</text>
<polygon fill="#c079f3" stroke="none" points="51,-593 51,-616 105,-616 105,-593 51,-593"/>
<polygon fill="none" stroke="black" points="51,-593 51,-616 105,-616 105,-593 51,-593"/>
<text text-anchor="start" x="60.5" y="-602" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#c079f3" stroke="none" points="110,-593 110,-616 163,-616 163,-593 110,-593"/>
<polygon fill="none" stroke="black" points="110,-593 110,-616 163,-616 163,-593 110,-593"/>
<text text-anchor="start" x="119" y="-602" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#c079f3" stroke="none" points="51,-565 51,-588 105,-588 105,-565 51,-565"/>
<polygon fill="none" stroke="black" points="51,-565 51,-588 105,-588 105,-565 51,-565"/>
<text text-anchor="start" x="57.5" y="-574" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.3</text>
<polygon fill="#c079f3" stroke="none" points="110,-565 110,-588 163,-588 163,-565 110,-565"/>
<polygon fill="none" stroke="black" points="110,-565 110,-588 163,-588 163,-565 110,-565"/>
<text text-anchor="start" x="116" y="-574" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.4</text>
</g>
<!-- ComputeNode&#45;&gt;VMs -->
<!-- LinuxBridge -->
<g id="node3" class="node"><title>LinuxBridge</title>
<polygon fill="white" stroke="none" points="46,-364 46,-480 228,-480 228,-364 46,-364"/>
<polygon fill="white" stroke="none" points="51,-453 51,-475 223,-475 223,-453 51,-453"/>
<text text-anchor="start" x="109.5" y="-461.5" font-family="Helvetica,sans-Serif" font-size="10.00">Linux Bridge</text>
<polygon fill="#c079f3" stroke="none" points="51,-425 51,-448 136,-448 136,-425 51,-425"/>
<polygon fill="none" stroke="black" points="51,-425 51,-448 136,-448 136,-425 51,-425"/>
<text text-anchor="start" x="60" y="-434" font-family="Helvetica,sans-Serif" font-size="10.00">tap71ac5bef&#45;7c</text>
<polygon fill="#c079f3" stroke="none" points="51,-397 51,-420 136,-420 136,-397 51,-397"/>
<polygon fill="none" stroke="black" points="51,-397 51,-420 136,-420 136,-397 51,-397"/>
<text text-anchor="start" x="58.5" y="-406" font-family="Helvetica,sans-Serif" font-size="10.00">qbr8aa60600&#45;7b</text>
<polygon fill="#c079f3" stroke="none" points="141,-397 141,-420 223,-420 223,-397 141,-397"/>
<polygon fill="none" stroke="black" points="141,-397 141,-420 223,-420 223,-397 141,-397"/>
<text text-anchor="start" x="148.5" y="-406" font-family="Helvetica,sans-Serif" font-size="10.00">qbr71ac5bef&#45;7c</text>
<polygon fill="#c079f3" stroke="none" points="51,-369 51,-392 136,-392 136,-369 51,-369"/>
<polygon fill="none" stroke="black" points="51,-369 51,-392 136,-392 136,-369 51,-369"/>
<text text-anchor="start" x="57.5" y="-378" font-family="Helvetica,sans-Serif" font-size="10.00">qvb8aa60600&#45;7b</text>
<polygon fill="#c079f3" stroke="none" points="141,-369 141,-392 223,-392 223,-369 141,-369"/>
<polygon fill="none" stroke="black" points="141,-369 141,-392 223,-392 223,-369 141,-369"/>
<text text-anchor="start" x="147" y="-378" font-family="Helvetica,sans-Serif" font-size="10.00">qvb71ac5bef&#45;7c</text>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge2" class="edge"><title>VMs:101004:s&#45;&gt;LinuxBridge:tap71ac5bef_7c:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M137,-564C137,-509.276 93,-503.724 93,-449"/>
</g>
<!-- compute_br_int -->
<g id="node4" class="node"><title>compute_br_int</title>
<polygon fill="white" stroke="none" points="32,-168 32,-284 242,-284 242,-168 32,-168"/>
<polygon fill="white" stroke="none" points="37,-257 37,-279 237,-279 237,-257 37,-257"/>
<text text-anchor="start" x="112.5" y="-265.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_int</text>
<polygon fill="#c079f3" stroke="none" points="37,-229 37,-252 136,-252 136,-229 37,-229"/>
<polygon fill="none" stroke="black" points="37,-229 37,-252 136,-252 136,-229 37,-229"/>
<text text-anchor="start" x="43.5" y="-238" font-family="Helvetica,sans-Serif" font-size="10.00">[6] qvo8aa60600&#45;7b</text>
<polygon fill="#c079f3" stroke="none" points="141,-229 141,-252 237,-252 237,-229 141,-229"/>
<polygon fill="none" stroke="black" points="141,-229 141,-252 237,-252 237,-229 141,-229"/>
<text text-anchor="start" x="147" y="-238" font-family="Helvetica,sans-Serif" font-size="10.00">[7] qvo71ac5bef&#45;7c</text>
<polygon fill="#c079f3" stroke="none" points="37,-201 37,-224 136,-224 136,-201 37,-201"/>
<polygon fill="none" stroke="black" points="37,-201 37,-224 136,-224 136,-201 37,-201"/>
<text text-anchor="start" x="60.5" y="-210" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="141,-201 141,-224 237,-224 237,-201 141,-201"/>
<polygon fill="none" stroke="black" points="141,-201 141,-224 237,-224 237,-201 141,-201"/>
<text text-anchor="start" x="163" y="-210" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#ffcc00" stroke="none" points="37,-173 37,-196 237,-196 237,-173 37,-173"/>
<polygon fill="none" stroke="black" points="37,-173 37,-196 237,-196 237,-173 37,-173"/>
<text text-anchor="start" x="109.5" y="-182" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;tun</text>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge3" class="edge"><title>LinuxBridge:qvb8aa60600_7b:s&#45;&gt;compute_br_int:qvo8aa60600_7b:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M93,-368C93,-316.794 86,-304.206 86,-253"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge4" class="edge"><title>LinuxBridge:qvb71ac5bef_7c:s&#45;&gt;compute_br_int:qvo71ac5bef_7c:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M182,-368C182,-316.794 189,-304.206 189,-253"/>
</g>
<!-- compute_br_tun -->
<g id="node5" class="node"><title>compute_br_tun</title>
<polygon fill="white" stroke="none" points="97,-28 97,-88 177,-88 177,-28 97,-28"/>
<polygon fill="white" stroke="none" points="102,-61 102,-83 172,-83 172,-61 102,-61"/>
<text text-anchor="start" x="111" y="-69.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_tun</text>
<polygon fill="#ffcc00" stroke="none" points="102,-33 102,-56 172,-56 172,-33 102,-33"/>
<polygon fill="none" stroke="black" points="102,-33 102,-56 172,-56 172,-33 102,-33"/>
<text text-anchor="start" x="111" y="-42" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;int</text>
</g>
<!-- compute_br_int&#45;&gt;compute_br_tun -->
<g id="edge5" class="edge"><title>compute_br_int:patch_tun:s&#45;&gt;compute_br_tun:patch_int:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M137,-172C137,-120.889 137,-108.111 137,-57"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.5 KiB

211
static/don/don.css Normal file
View File

@ -0,0 +1,211 @@
body {
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
color: black;
background-color: #ffffff
}
pre {
width: 500px; /* specify width */
white-space: pre-wrap; /* CSS3 browsers */
white-space: -moz-pre-wrap !important; /* 1999+ Mozilla */
white-space: -pre-wrap; /* Opera 4 thru 6 */
white-space: -o-pre-wrap; /* Opera 7 and up */
/* word-wrap: break-word; */ /* IE 5.5+ and up */
font-family: "Courier New", monospace;
line-height: 1.6em;
margin: 1.7em 0 1.7em 0.3em;
font-size: 12px;
/* overflow-x: auto; */ /* Firefox 2 only */
width: 90%; /* only if needed */
}
h2 {
font-family: Georgia, Helvetica,san-Serif;
font-weight: bold;
font-size: 20pt;
/*color:#fffff0;*/
color: #2A4E68;
padding: 5px;
margin: 20px 0px 0px 0px;
/*background:#3399ff;*/
/*border-radius: 20px;*/
/*
font-family: "Helvetica Neue", Helvetica, Geneva, Arial,
SunSans-Regular, sans-serif;
padding: 0px;
font-weight: normal;
color: #2A4E68;
border-top: 1px solid black;
#border-bottom: 0.5px solid black;
#background: #ff9933;
#border-radius: 10px;
width:750px;
*/
}
h3 {
font-family: "Helvetica Neue", Helvetica, Geneva, Arial,
SunSans-Regular, sans-serif;
margin: 0px 0px 0px 0px;
padding: 5px;
font-weight: normal;
font-style: italic;
color: #ff9933;
border-bottom: 0.5px solid black;
width:750px; /*Change this to whatever value that you want*/
}
pre.pass {
border-left: 2px solid #009900;
}
pre.fail {
border-left: 2px solid #f00000;
}
font.pass {color:#00cc00; text-decoration:none;}
font.fail {color:#f00000; font-weight:bold; text-decoration:none;}
.collapsibleList li{
list-style-image:url('button.png');
cursor:auto;
margin:0 0 5px 0;
}
li.collapsibleListOpen{
list-style-image:url('button-open.png');
cursor:pointer;
margin:0 0 5px 0;
}
li.collapsibleListClosed{
list-style-image:url('button-closed.png');
cursor:pointer;
}
.message {
position: absolute;
display: none;
border: 0px solid red;
width:80px;
height:80px;
padding: 0px;
float: top;
font-size: 8pt;
}
#main {
width:1000px;
float:left;
border: 0px solid red;
}
#internal {
width:1800px;
float:left;
border: 0px solid red;
}
table
{
font-family: Helvetica,san-Serif;
font-weight: normal;
font-size: large;
border: 0px solid blue;
padding: 0px;
border-spacing:0px;
border-collapse:collapse;
}
th {
font-family: Georgia, Helvetica,san-Serif;
font-weight: bold;
font-size: 20pt;
/*color:#fffff0;*/
color: #2A4E68;
padding: 5px;
/*background:#3399ff;*/
/*border-radius: 20px;*/
}
tr {
font-family: Helvetica,san-Serif;
font-weight: normal;
font-size: large;
padding: 0px;
vertical-align: top;
}
td {
font-family: Helvetica,san-Serif;
font-weight: normal;
font-size: large;
vertical-align: middle;
padding: 5px;
border-style: solid;
border-width: 0px;
border-color: black;
}
td.clickme {
font-family: Helvetica,san-Serif;
font-weight: normal;
font-size: large;
vertical-align: bottom;
padding: 20px;
/*background:#e5e5e5;*/
background:#ffffff;
border-radius: 15px;
border-style: solid;
border-width: 0px;
border-color: black;
text-align: center;
}
.myButton {
-moz-box-shadow: 0px 10px 14px -7px #3e7327;
-webkit-box-shadow: 0px 10px 14px -7px #3e7327;
box-shadow: 0px 10px 14px -7px #3e7327;
background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #77b55a), color-stop(1, #72b352));
background:-moz-linear-gradient(top, #77b55a 5%, #72b352 100%);
background:-webkit-linear-gradient(top, #77b55a 5%, #72b352 100%);
background:-o-linear-gradient(top, #77b55a 5%, #72b352 100%);
background:-ms-linear-gradient(top, #77b55a 5%, #72b352 100%);
background:linear-gradient(to bottom, #77b55a 5%, #72b352 100%);
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#77b55a', endColorstr='#72b352',GradientType=0);
background-color:#77b55a;
-moz-border-radius:4px;
-webkit-border-radius:4px;
border-radius:4px;
border:1px solid #4b8f29;
display:inline-block;
cursor:pointer;
color:#ffffff;
font-family:Arial;
font-size:20px;
font-weight:bold;
padding:6px 12px;
text-decoration:none;
text-shadow:0px 1px 0px #5b8a3c;
}
.myButton:hover {
background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #72b352), color-stop(1, #77b55a));
background:-moz-linear-gradient(top, #72b352 5%, #77b55a 100%);
background:-webkit-linear-gradient(top, #72b352 5%, #77b55a 100%);
background:-o-linear-gradient(top, #72b352 5%, #77b55a 100%);
background:-ms-linear-gradient(top, #72b352 5%, #77b55a 100%);
background:linear-gradient(to bottom, #72b352 5%, #77b55a 100%);
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#72b352', endColorstr='#77b55a',GradientType=0);
background-color:#72b352;
}
.myButton:active {
position:relative;
top:1px;
}

200
static/don/don.dot Normal file
View File

@ -0,0 +1,200 @@
digraph DON_DON {
graph [fontsize=10 fontname="Helvetica"];
node [fontsize=10 fontname="Helvetica"];
rankdir = TB;
ranksep = 1;
concentrate = true;
compound = true;
edge [dir=none]
subgraph cluster_DONComputeNode {
style=filled
subgraph cluster_ComputeNode {
ComputeNode [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="red">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="yellow" PORT="ComputeNode">Compute Node</TD>
</TR>
</TABLE>>];
}
subgraph cluster_Nova {
style=filled
subgraph cluster_VMs {
VMs [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="VMs">VMs</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933">vm1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933">vm2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3">private1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3">private1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="101003">10.10.0.3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="101004">10.10.0.4</TD>
</TR>
</TABLE>>];
}
subgraph cluster_LinuxBridge {
LinuxBridge [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="LinuxBridge">Linux Bridge</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tap71ac5bef_7c">tap71ac5bef-7c</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qbr8aa60600_7b">qbr8aa60600-7b</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qbr71ac5bef_7c">qbr71ac5bef-7c</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvb8aa60600_7b">qvb8aa60600-7b</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvb71ac5bef_7c">qvb71ac5bef-7c</TD>
</TR>
</TABLE>>];
}
}
subgraph cluster_OVS {
style=filled
subgraph cluster_compute_br_int {
compute_br_int [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_int">OVS br_int</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvo8aa60600_7b">[6] qvo8aa60600-7b</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvo71ac5bef_7c">[7] qvo71ac5bef-7c</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvo8aa60600_7btag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qvo71ac5bef_7ctag_2">VLAN tag:2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ffcc00" PORT="patch_tun">[1] patch-tun</TD>
</TR>
</TABLE>>];
}
subgraph cluster_compute_br_tun {
compute_br_tun [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_tun">OVS br_tun</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ffcc00" PORT="patch_int">[1] patch-int</TD>
</TR>
</TABLE>>];
}
}
ComputeNode:s -> VMs:n [color = "#0066cc", penwidth = "4", style="invis"]
VMs:101004:s -> LinuxBridge:tap71ac5bef_7c:n [color = "#0066cc", penwidth = "4"]
LinuxBridge:qvb8aa60600_7b:s -> compute_br_int:qvo8aa60600_7b:n [color = "#0066cc", penwidth = "4"]
LinuxBridge:qvb71ac5bef_7c:s -> compute_br_int:qvo71ac5bef_7c:n [color = "#0066cc", penwidth = "4"]
compute_br_int:patch_tun:s -> compute_br_tun:patch_int:n [color = "#0066cc", penwidth = "4"]
}
subgraph cluster_DONNetworkNode {
style=filled
subgraph cluster_NetworkNode {
NetworkNode [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="red">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="yellow" PORT="NetworkNode">Network Node</TD>
</TR>
</TABLE>>];
}
subgraph cluster_OVS {
style=filled
subgraph cluster_br_ex {
br_ex [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="white" PORT="OVSbr_ex">OVS br_ex</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="router1">router1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="172.24.4.3/24">172.24.4.3/24</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="qg_757bf552_73">[2] qg-757bf552-73</TD>
</TR>
</TABLE>>];
}
subgraph cluster_network_br_int {
network_br_int [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_int">OVS br_int</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_43b83157_3b">[8] qr-43b83157-3b</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tap1e1c73c9_35">[10] tap1e1c73c9-35</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_43b83157_3btag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tap1e1c73c9_35tag_2">VLAN tag:2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_43b83157_3b10.10.0.1/24">10.10.0.1/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tap1e1c73c9_3510.10.0.5/24">10.10.0.5/24</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#c079f3" PORT="private1">private1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ff9933" PORT="router1">router1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ffcc00" PORT="patch_tun">[1] patch-tun</TD>
</TR>
</TABLE>>];
}
subgraph cluster_network_br_tun {
network_br_tun [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_tun">OVS br_tun</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ffcc00" PORT="patch_int">[1] patch-int</TD>
</TR>
</TABLE>>];
}
}
NetworkNode:s -> br_ex:n [color = "#0066cc", penwidth = "4", style="invis"]
network_br_int:patch_tun:s -> network_br_tun:patch_int:n [color = "#0066cc", penwidth = "4"]
br_ex:qg_757bf552_73:s -> network_br_int:qr_43b83157_3b:n [color = "#0066cc", penwidth = "4"]
}
}

144
static/don/don.report.html Normal file
View File

@ -0,0 +1,144 @@
<html>
<head>
<script type="text/javascript" src="CollapsibleLists.js"></script>
<link rel="stylesheet" type="text/css" href="don.css">
<title>DON: Analysis Results</title>
</head>
<body onload=CollapsibleLists.apply()>
<h2>OVS Test Results</h2>
<h3>OVS test between all pairs of ports using the same tag in br-int</h3>
<ul class="collapsibleList">
<li>OVS bridge br-int
<ul class="collapsibleList">
<li>tag 2
<ul class="collapsibleList">
<li> 6 &rarr; 7 <font class="fail">&#10008;</font>
<ul class="collapsibleList">
<pre class="fail">
'sudo ovs-appctl fdb/flush br-int'
'sudo ovs-appctl ofproto/trace br-int in_port=6,dl_src=AA:BB:CC:DD:EE:11,dl_dst=AA:BB:CC:DD:EE:22 -generate'
'sudo ovs-appctl fdb/show br-int'
'sudo ovs-appctl ofproto/trace br-int in_port=7,dl_src=AA:BB:CC:DD:EE:22,dl_dst=AA:BB:CC:DD:EE:11 -generate'
{
"command_list": [
{
"cmd": "sudo ovs-appctl fdb/flush br-int",
"output": [
"table successfully flushed",
""
]
},
{
"cmd": "sudo ovs-appctl ofproto/trace br-int in_port=6,dl_src=AA:BB:CC:DD:EE:11,dl_dst=AA:BB:CC:DD:EE:22 -generate",
"output": [
"Flow: metadata=0,in_port=6,vlan_tci=0x0000,dl_src=aa:bb:cc:dd:ee:11,dl_dst=aa:bb:cc:dd:ee:22,dl_type=0x0000",
"Rule: table=0 cookie=0xbafdefa428c693b6 priority=0",
"OpenFlow actions=NORMAL",
"no learned MAC for destination, flooding",
"",
" Resubmitted flow: metadata=0,in_port=1,dl_vlan=2,dl_vlan_pcp=0,dl_src=aa:bb:cc:dd:ee:11,dl_dst=aa:bb:cc:dd:ee:22,dl_type=0x0000",
" Resubmitted regs: reg0=0x0 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0",
" Resubmitted odp: push_vlan(vid=2,pcp=0),6,pop_vlan,8,push_vlan(vid=2,pcp=0),5,9",
" Rule: table=0 cookie=0xbafdefa428c693b6 priority=1,in_port=1",
" OpenFlow actions=resubmit(,2)",
"",
" Resubmitted flow: unchanged",
" Resubmitted regs: reg0=0x0 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0",
" Resubmitted odp: push_vlan(vid=2,pcp=0),6,pop_vlan,8,push_vlan(vid=2,pcp=0),5,9",
" Rule: table=2 cookie=0xbafdefa428c693b6 priority=0,dl_dst=00:00:00:00:00:00/01:00:00:00:00:00",
" OpenFlow actions=resubmit(,20)",
"",
" Resubmitted flow: unchanged",
" Resubmitted regs: reg0=0x0 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0",
" Resubmitted odp: push_vlan(vid=2,pcp=0),6,pop_vlan,8,push_vlan(vid=2,pcp=0),5,9",
" Rule: table=20 cookie=0xbafdefa428c693b6 priority=0",
" OpenFlow actions=resubmit(,22)",
"",
" Resubmitted flow: unchanged",
" Resubmitted regs: reg0=0x0 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0",
" Resubmitted odp: push_vlan(vid=2,pcp=0),6,pop_vlan,8,push_vlan(vid=2,pcp=0),5,9",
" Rule: table=22 cookie=0xbafdefa428c693b6 priority=0",
" OpenFlow actions=drop",
"",
"Final flow: metadata=0,in_port=6,vlan_tci=0x0000,dl_src=aa:bb:cc:dd:ee:11,dl_dst=aa:bb:cc:dd:ee:22,dl_type=0x0000",
"Relevant fields: skb_priority=0,in_port=6,vlan_tci=0x0000,dl_src=aa:bb:cc:dd:ee:11,dl_dst=aa:bb:cc:dd:ee:22,dl_type=0x0000,nw_proto=0,nw_frag=no,tp_src=0",
"Datapath actions: push_vlan(vid=2,pcp=0),6,pop_vlan,8,push_vlan(vid=2,pcp=0),5,9,pop_vlan,13,14",
""
]
},
{
"cmd": "sudo ovs-appctl fdb/show br-int",
"output": [
" port VLAN MAC Age",
" 6 2 aa:bb:cc:dd:ee:11 0",
""
]
},
{
"cmd": "sudo ovs-appctl ofproto/trace br-int in_port=7,dl_src=AA:BB:CC:DD:EE:22,dl_dst=AA:BB:CC:DD:EE:11 -generate",
"output": [
"Flow: metadata=0,in_port=7,vlan_tci=0x0000,dl_src=aa:bb:cc:dd:ee:22,dl_dst=aa:bb:cc:dd:ee:11,dl_type=0x0000",
"Rule: table=0 cookie=0xbafdefa428c693b6 priority=0",
"OpenFlow actions=NORMAL",
"forwarding to learned port",
"",
"Final flow: unchanged",
"Relevant fields: skb_priority=0,in_port=7,vlan_tci=0x0000/0x1fff,dl_src=aa:bb:cc:dd:ee:22,dl_dst=aa:bb:cc:dd:ee:11,dl_type=0x0000,nw_proto=0,nw_frag=no,tp_src=0",
"Datapath actions: 12",
""
]
}
],
"comment": "ovs br-int port 6 --> 7",
"debugs": [
"AA:BB:CC:DD:EE:11 learnt on expected vlan 2 on port 6",
"Packet for learnt mac forwarded properly"
],
"errors": [
"Packet forwarded to incorrect port 12, expected 6"
],
"pass": false
}
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
OVERALL RESULT: <font class="fail">&#10008;</font>
<h2>Ping Test Results</h2>
<h3>Ping test between all pairs of VMs</h3>
<ul class="collapsibleList">
<li>router1 (Namespace [qrouter-90111551-6cfc-4be0-b1c2-ce8bffb7edf6])
<ul class="collapsibleList">
<li>vm1 &rarr; vm2
<ul class="collapsibleList">
<li> 10.10.0.3 &rarr; 10.10.0.4 <font class="fail">&#10008;</font>
<ul class="collapsibleList">
<pre class="fail">
{
"command_list": [
{
"cmd": "ssh 10.10.0.3 with provided username and passwd",
"output": "Could not ssh to 10.10.0.3",
"pass": false
}
],
"comment": "PING 10.10.0.3 to 10.10.0.4",
"errors": [],
"pass": false
}
</pre>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
OVERALL RESULT: <font class="fail">&#10008;</font>
</body>
</html>

225
static/don/don.svg Normal file
View File

@ -0,0 +1,225 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.36.0 (20140111.2315)
-->
<!-- Title: DON_DON Pages: 1 -->
<svg width="582pt" height="916pt"
viewBox="0.00 0.00 582.00 916.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 912)">
<title>DON_DON</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-912 578,-912 578,4 -4,4"/>
<g id="clust1" class="cluster"><title>cluster_DONComputeNode</title>
<polygon fill="lightgrey" stroke="black" points="8,-8 8,-900 282,-900 282,-8 8,-8"/>
</g>
<g id="clust2" class="cluster"><title>cluster_ComputeNode</title>
<polygon fill="lightgrey" stroke="black" points="55,-836 55,-892 175,-892 175,-836 55,-836"/>
</g>
<g id="clust3" class="cluster"><title>cluster_Nova</title>
<polygon fill="lightgrey" stroke="black" points="30,-394 30,-788 260,-788 260,-394 30,-394"/>
</g>
<g id="clust4" class="cluster"><title>cluster_VMs</title>
<polygon fill="lightgrey" stroke="black" points="38,-640 38,-780 192,-780 192,-640 38,-640"/>
</g>
<g id="clust5" class="cluster"><title>cluster_LinuxBridge</title>
<polygon fill="lightgrey" stroke="black" points="38,-402 38,-542 252,-542 252,-402 38,-402"/>
</g>
<g id="clust6" class="cluster"><title>cluster_OVS</title>
<polygon fill="lightgrey" stroke="black" points="16,-16 16,-312 274,-312 274,-16 16,-16"/>
</g>
<g id="clust7" class="cluster"><title>cluster_compute_br_int</title>
<polygon fill="lightgrey" stroke="black" points="24,-164 24,-304 266,-304 266,-164 24,-164"/>
</g>
<g id="clust8" class="cluster"><title>cluster_compute_br_tun</title>
<polygon fill="lightgrey" stroke="black" points="89,-24 89,-108 201,-108 201,-24 89,-24"/>
</g>
<g id="clust9" class="cluster"><title>cluster_DONNetworkNode</title>
<polygon fill="lightgrey" stroke="black" points="290,-176 290,-900 566,-900 566,-176 290,-176"/>
</g>
<g id="clust11" class="cluster"><title>cluster_OVS</title>
<polygon fill="lightgrey" stroke="black" points="298,-184 298,-788 558,-788 558,-184 298,-184"/>
</g>
<g id="clust12" class="cluster"><title>cluster_br_ex</title>
<polygon fill="lightgrey" stroke="black" points="306,-640 306,-780 444,-780 444,-640 306,-640"/>
</g>
<g id="clust13" class="cluster"><title>cluster_network_br_int</title>
<polygon fill="lightgrey" stroke="black" points="306,-360 306,-584 550,-584 550,-360 306,-360"/>
</g>
<g id="clust14" class="cluster"><title>cluster_network_br_tun</title>
<polygon fill="lightgrey" stroke="black" points="373,-192 373,-276 485,-276 485,-192 373,-192"/>
</g>
<g id="clust10" class="cluster"><title>cluster_NetworkNode</title>
<polygon fill="lightgrey" stroke="black" points="316,-836 316,-892 434,-892 434,-836 316,-836"/>
</g>
<!-- ComputeNode -->
<g id="node1" class="node"><title>ComputeNode</title>
<polygon fill="red" stroke="none" points="71,-848 71,-880 159,-880 159,-848 71,-848"/>
<polygon fill="yellow" stroke="none" points="76,-853 76,-875 154,-875 154,-853 76,-853"/>
<text text-anchor="start" x="81.5" y="-861.5" font-family="Helvetica,sans-Serif" font-size="10.00">Compute Node</text>
</g>
<!-- VMs -->
<g id="node2" class="node"><title>VMs</title>
<polygon fill="white" stroke="none" points="54,-652 54,-768 176,-768 176,-652 54,-652"/>
<polygon fill="white" stroke="none" points="59,-741 59,-763 171,-763 171,-741 59,-741"/>
<text text-anchor="start" x="104.5" y="-749.5" font-family="Helvetica,sans-Serif" font-size="10.00">VMs</text>
<polygon fill="#ff9933" stroke="none" points="59,-713 59,-736 113,-736 113,-713 59,-713"/>
<polygon fill="none" stroke="black" points="59,-713 59,-736 113,-736 113,-713 59,-713"/>
<text text-anchor="start" x="76.5" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">vm1</text>
<polygon fill="#ff9933" stroke="none" points="118,-713 118,-736 171,-736 171,-713 118,-713"/>
<polygon fill="none" stroke="black" points="118,-713 118,-736 171,-736 171,-713 118,-713"/>
<text text-anchor="start" x="135" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">vm2</text>
<polygon fill="#c079f3" stroke="none" points="59,-685 59,-708 113,-708 113,-685 59,-685"/>
<polygon fill="none" stroke="black" points="59,-685 59,-708 113,-708 113,-685 59,-685"/>
<text text-anchor="start" x="68.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#c079f3" stroke="none" points="118,-685 118,-708 171,-708 171,-685 118,-685"/>
<polygon fill="none" stroke="black" points="118,-685 118,-708 171,-708 171,-685 118,-685"/>
<text text-anchor="start" x="127" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#c079f3" stroke="none" points="59,-657 59,-680 113,-680 113,-657 59,-657"/>
<polygon fill="none" stroke="black" points="59,-657 59,-680 113,-680 113,-657 59,-657"/>
<text text-anchor="start" x="65.5" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.3</text>
<polygon fill="#c079f3" stroke="none" points="118,-657 118,-680 171,-680 171,-657 118,-657"/>
<polygon fill="none" stroke="black" points="118,-657 118,-680 171,-680 171,-657 118,-657"/>
<text text-anchor="start" x="124" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.4</text>
</g>
<!-- ComputeNode&#45;&gt;VMs -->
<!-- LinuxBridge -->
<g id="node3" class="node"><title>LinuxBridge</title>
<polygon fill="white" stroke="none" points="54,-414 54,-530 236,-530 236,-414 54,-414"/>
<polygon fill="white" stroke="none" points="59,-503 59,-525 231,-525 231,-503 59,-503"/>
<text text-anchor="start" x="117.5" y="-511.5" font-family="Helvetica,sans-Serif" font-size="10.00">Linux Bridge</text>
<polygon fill="#c079f3" stroke="none" points="59,-475 59,-498 144,-498 144,-475 59,-475"/>
<polygon fill="none" stroke="black" points="59,-475 59,-498 144,-498 144,-475 59,-475"/>
<text text-anchor="start" x="68" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tap71ac5bef&#45;7c</text>
<polygon fill="#c079f3" stroke="none" points="59,-447 59,-470 144,-470 144,-447 59,-447"/>
<polygon fill="none" stroke="black" points="59,-447 59,-470 144,-470 144,-447 59,-447"/>
<text text-anchor="start" x="66.5" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbr8aa60600&#45;7b</text>
<polygon fill="#c079f3" stroke="none" points="149,-447 149,-470 231,-470 231,-447 149,-447"/>
<polygon fill="none" stroke="black" points="149,-447 149,-470 231,-470 231,-447 149,-447"/>
<text text-anchor="start" x="156.5" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbr71ac5bef&#45;7c</text>
<polygon fill="#c079f3" stroke="none" points="59,-419 59,-442 144,-442 144,-419 59,-419"/>
<polygon fill="none" stroke="black" points="59,-419 59,-442 144,-442 144,-419 59,-419"/>
<text text-anchor="start" x="65.5" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvb8aa60600&#45;7b</text>
<polygon fill="#c079f3" stroke="none" points="149,-419 149,-442 231,-442 231,-419 149,-419"/>
<polygon fill="none" stroke="black" points="149,-419 149,-442 231,-442 231,-419 149,-419"/>
<text text-anchor="start" x="155" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvb71ac5bef&#45;7c</text>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge2" class="edge"><title>VMs:101004:s&#45;&gt;LinuxBridge:tap71ac5bef_7c:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M145,-656C145,-583.534 101,-571.466 101,-499"/>
</g>
<!-- compute_br_int -->
<g id="node4" class="node"><title>compute_br_int</title>
<polygon fill="white" stroke="none" points="40,-176 40,-292 250,-292 250,-176 40,-176"/>
<polygon fill="white" stroke="none" points="45,-265 45,-287 245,-287 245,-265 45,-265"/>
<text text-anchor="start" x="120.5" y="-273.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_int</text>
<polygon fill="#c079f3" stroke="none" points="45,-237 45,-260 144,-260 144,-237 45,-237"/>
<polygon fill="none" stroke="black" points="45,-237 45,-260 144,-260 144,-237 45,-237"/>
<text text-anchor="start" x="51.5" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[6] qvo8aa60600&#45;7b</text>
<polygon fill="#c079f3" stroke="none" points="149,-237 149,-260 245,-260 245,-237 149,-237"/>
<polygon fill="none" stroke="black" points="149,-237 149,-260 245,-260 245,-237 149,-237"/>
<text text-anchor="start" x="155" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[7] qvo71ac5bef&#45;7c</text>
<polygon fill="#c079f3" stroke="none" points="45,-209 45,-232 144,-232 144,-209 45,-209"/>
<polygon fill="none" stroke="black" points="45,-209 45,-232 144,-232 144,-209 45,-209"/>
<text text-anchor="start" x="68.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="149,-209 149,-232 245,-232 245,-209 149,-209"/>
<polygon fill="none" stroke="black" points="149,-209 149,-232 245,-232 245,-209 149,-209"/>
<text text-anchor="start" x="171" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#ffcc00" stroke="none" points="45,-181 45,-204 245,-204 245,-181 45,-181"/>
<polygon fill="none" stroke="black" points="45,-181 45,-204 245,-204 245,-181 45,-181"/>
<text text-anchor="start" x="117.5" y="-190" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;tun</text>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge3" class="edge"><title>LinuxBridge:qvb8aa60600_7b:s&#45;&gt;compute_br_int:qvo8aa60600_7b:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M101,-418C101,-348.153 94,-330.847 94,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge4" class="edge"><title>LinuxBridge:qvb71ac5bef_7c:s&#45;&gt;compute_br_int:qvo71ac5bef_7c:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M190,-418C190,-348.153 197,-330.847 197,-261"/>
</g>
<!-- compute_br_tun -->
<g id="node5" class="node"><title>compute_br_tun</title>
<polygon fill="white" stroke="none" points="105,-36 105,-96 185,-96 185,-36 105,-36"/>
<polygon fill="white" stroke="none" points="110,-69 110,-91 180,-91 180,-69 110,-69"/>
<text text-anchor="start" x="119" y="-77.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_tun</text>
<polygon fill="#ffcc00" stroke="none" points="110,-41 110,-64 180,-64 180,-41 110,-41"/>
<polygon fill="none" stroke="black" points="110,-41 110,-64 180,-64 180,-41 110,-41"/>
<text text-anchor="start" x="119" y="-50" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;int</text>
</g>
<!-- compute_br_int&#45;&gt;compute_br_tun -->
<g id="edge5" class="edge"><title>compute_br_int:patch_tun:s&#45;&gt;compute_br_tun:patch_int:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M145,-180C145,-128.889 145,-116.111 145,-65"/>
</g>
<!-- NetworkNode -->
<g id="node6" class="node"><title>NetworkNode</title>
<polygon fill="red" stroke="none" points="332.5,-848 332.5,-880 417.5,-880 417.5,-848 332.5,-848"/>
<polygon fill="yellow" stroke="none" points="338,-853 338,-875 413,-875 413,-853 338,-853"/>
<text text-anchor="start" x="343.5" y="-861.5" font-family="Helvetica,sans-Serif" font-size="10.00">Network Node</text>
</g>
<!-- br_ex -->
<g id="node7" class="node"><title>br_ex</title>
<polygon fill="white" stroke="none" points="322.5,-652 322.5,-768 427.5,-768 427.5,-652 322.5,-652"/>
<polygon fill="white" stroke="none" points="328,-741 328,-763 423,-763 423,-741 328,-741"/>
<text text-anchor="start" x="351" y="-749.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_ex</text>
<polygon fill="#ff9933" stroke="none" points="328,-713 328,-736 423,-736 423,-713 328,-713"/>
<polygon fill="none" stroke="black" points="328,-713 328,-736 423,-736 423,-713 328,-713"/>
<text text-anchor="start" x="360" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">router1</text>
<polygon fill="#ff9933" stroke="none" points="328,-685 328,-708 423,-708 423,-685 328,-685"/>
<polygon fill="none" stroke="black" points="328,-685 328,-708 423,-708 423,-685 328,-685"/>
<text text-anchor="start" x="345.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">172.24.4.3/24</text>
<polygon fill="#ff9933" stroke="none" points="328,-657 328,-680 423,-680 423,-657 328,-657"/>
<polygon fill="none" stroke="black" points="328,-657 328,-680 423,-680 423,-657 328,-657"/>
<text text-anchor="start" x="334.5" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">[2] qg&#45;757bf552&#45;73</text>
</g>
<!-- NetworkNode&#45;&gt;br_ex -->
<!-- network_br_int -->
<g id="node8" class="node"><title>network_br_int</title>
<polygon fill="white" stroke="none" points="322.5,-372 322.5,-572 533.5,-572 533.5,-372 322.5,-372"/>
<polygon fill="white" stroke="none" points="328,-545 328,-567 529,-567 529,-545 328,-545"/>
<text text-anchor="start" x="404" y="-553.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_int</text>
<polygon fill="#c079f3" stroke="none" points="328,-517 328,-540 423,-540 423,-517 328,-517"/>
<polygon fill="none" stroke="black" points="328,-517 328,-540 423,-540 423,-517 328,-517"/>
<text text-anchor="start" x="334.5" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[8] qr&#45;43b83157&#45;3b</text>
<polygon fill="#c079f3" stroke="none" points="428,-517 428,-540 529,-540 529,-517 428,-517"/>
<polygon fill="none" stroke="black" points="428,-517 428,-540 529,-540 529,-517 428,-517"/>
<text text-anchor="start" x="434" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[10] tap1e1c73c9&#45;35</text>
<polygon fill="#c079f3" stroke="none" points="328,-489 328,-512 423,-512 423,-489 328,-489"/>
<polygon fill="none" stroke="black" points="328,-489 328,-512 423,-512 423,-489 328,-489"/>
<text text-anchor="start" x="349.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="428,-489 428,-512 529,-512 529,-489 428,-489"/>
<polygon fill="none" stroke="black" points="428,-489 428,-512 529,-512 529,-489 428,-489"/>
<text text-anchor="start" x="452.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="328,-461 328,-484 423,-484 423,-461 328,-461"/>
<polygon fill="none" stroke="black" points="328,-461 328,-484 423,-484 423,-461 328,-461"/>
<text text-anchor="start" x="348" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.1/24</text>
<polygon fill="#c079f3" stroke="none" points="428,-461 428,-484 529,-484 529,-461 428,-461"/>
<polygon fill="none" stroke="black" points="428,-461 428,-484 529,-484 529,-461 428,-461"/>
<text text-anchor="start" x="451" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.5/24</text>
<polygon fill="#c079f3" stroke="none" points="328,-433 328,-456 529,-456 529,-433 328,-433"/>
<polygon fill="none" stroke="black" points="328,-433 328,-456 529,-456 529,-433 328,-433"/>
<text text-anchor="start" x="411" y="-442" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#ff9933" stroke="none" points="328,-405 328,-428 529,-428 529,-405 328,-405"/>
<polygon fill="none" stroke="black" points="328,-405 328,-428 529,-428 529,-405 328,-405"/>
<text text-anchor="start" x="413" y="-414" font-family="Helvetica,sans-Serif" font-size="10.00">router1</text>
<polygon fill="#ffcc00" stroke="none" points="328,-377 328,-400 529,-400 529,-377 328,-377"/>
<polygon fill="none" stroke="black" points="328,-377 328,-400 529,-400 529,-377 328,-377"/>
<text text-anchor="start" x="401" y="-386" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;tun</text>
</g>
<!-- br_ex&#45;&gt;network_br_int -->
<g id="edge8" class="edge"><title>br_ex:qg_757bf552_73:s&#45;&gt;network_br_int:qr_43b83157_3b:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M376,-656C376,-604.887 375,-592.113 375,-541"/>
</g>
<!-- network_br_tun -->
<g id="node9" class="node"><title>network_br_tun</title>
<polygon fill="white" stroke="none" points="389,-204 389,-264 469,-264 469,-204 389,-204"/>
<polygon fill="white" stroke="none" points="394,-237 394,-259 464,-259 464,-237 394,-237"/>
<text text-anchor="start" x="403" y="-245.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_tun</text>
<polygon fill="#ffcc00" stroke="none" points="394,-209 394,-232 464,-232 464,-209 394,-209"/>
<polygon fill="none" stroke="black" points="394,-209 394,-232 464,-232 464,-209 394,-209"/>
<text text-anchor="start" x="403" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;int</text>
</g>
<!-- network_br_int&#45;&gt;network_br_tun -->
<g id="edge7" class="edge"><title>network_br_int:patch_tun:s&#45;&gt;network_br_tun:patch_int:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M429,-376C429,-312.444 429,-296.556 429,-233"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 17 KiB

92
static/don/network.dot Normal file
View File

@ -0,0 +1,92 @@
digraph DON_network {
graph [fontsize=10 fontname="Helvetica"];
node [fontsize=10 fontname="Helvetica"];
rankdir = TB;
ranksep = 1;
concentrate = true;
compound = true;
edge [dir=none]
subgraph cluster_NetworkNode {
NetworkNode [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="red">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="yellow" PORT="NetworkNode">Network Node</TD>
</TR>
</TABLE>>];
}
subgraph cluster_OVS {
style=filled
subgraph cluster_br_ex {
br_ex [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="white" PORT="OVSbr_ex">OVS br_ex</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="router1">router1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="172.24.4.3/24">172.24.4.3/24</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#ff9933" PORT="qg_757bf552_73">[2] qg-757bf552-73</TD>
</TR>
</TABLE>>];
}
subgraph cluster_network_br_int {
network_br_int [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_int">OVS br_int</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_43b83157_3b">[8] qr-43b83157-3b</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tap1e1c73c9_35">[10] tap1e1c73c9-35</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_43b83157_3btag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tap1e1c73c9_35tag_2">VLAN tag:2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="qr_43b83157_3b10.10.0.1/24">10.10.0.1/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#c079f3" PORT="tap1e1c73c9_3510.10.0.5/24">10.10.0.5/24</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#c079f3" PORT="private1">private1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ff9933" PORT="router1">router1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ffcc00" PORT="patch_tun">[1] patch-tun</TD>
</TR>
</TABLE>>];
}
subgraph cluster_network_br_tun {
network_br_tun [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_tun">OVS br_tun</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#ffcc00" PORT="patch_int">[1] patch-int</TD>
</TR>
</TABLE>>];
}
}
NetworkNode:s -> br_ex:n [color = "#0066cc", penwidth = "4", style="invis"]
network_br_int:patch_tun:s -> network_br_tun:patch_int:n [color = "#0066cc", penwidth = "4"]
br_ex:qg_757bf552_73:s -> network_br_int:qr_43b83157_3b:n [color = "#0066cc", penwidth = "4"]
}

100
static/don/network.svg Normal file
View File

@ -0,0 +1,100 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.36.0 (20140111.2315)
-->
<!-- Title: DON_network Pages: 1 -->
<svg width="284pt" height="704pt"
viewBox="0.00 0.00 284.00 704.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 700)">
<title>DON_network</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-700 280,-700 280,4 -4,4"/>
<g id="clust1" class="cluster"><title>cluster_NetworkNode</title>
<polygon fill="none" stroke="black" points="26,-632 26,-688 144,-688 144,-632 26,-632"/>
</g>
<g id="clust2" class="cluster"><title>cluster_OVS</title>
<polygon fill="lightgrey" stroke="black" points="8,-8 8,-584 268,-584 268,-8 8,-8"/>
</g>
<g id="clust3" class="cluster"><title>cluster_br_ex</title>
<polygon fill="lightgrey" stroke="black" points="16,-436 16,-576 154,-576 154,-436 16,-436"/>
</g>
<g id="clust4" class="cluster"><title>cluster_network_br_int</title>
<polygon fill="lightgrey" stroke="black" points="16,-156 16,-380 260,-380 260,-156 16,-156"/>
</g>
<g id="clust5" class="cluster"><title>cluster_network_br_tun</title>
<polygon fill="lightgrey" stroke="black" points="83,-16 83,-100 195,-100 195,-16 83,-16"/>
</g>
<!-- NetworkNode -->
<g id="node1" class="node"><title>NetworkNode</title>
<polygon fill="red" stroke="none" points="42.5,-644 42.5,-676 127.5,-676 127.5,-644 42.5,-644"/>
<polygon fill="yellow" stroke="none" points="48,-649 48,-671 123,-671 123,-649 48,-649"/>
<text text-anchor="start" x="53.5" y="-657.5" font-family="Helvetica,sans-Serif" font-size="10.00">Network Node</text>
</g>
<!-- br_ex -->
<g id="node2" class="node"><title>br_ex</title>
<polygon fill="white" stroke="none" points="32.5,-448 32.5,-564 137.5,-564 137.5,-448 32.5,-448"/>
<polygon fill="white" stroke="none" points="38,-537 38,-559 133,-559 133,-537 38,-537"/>
<text text-anchor="start" x="61" y="-545.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_ex</text>
<polygon fill="#ff9933" stroke="none" points="38,-509 38,-532 133,-532 133,-509 38,-509"/>
<polygon fill="none" stroke="black" points="38,-509 38,-532 133,-532 133,-509 38,-509"/>
<text text-anchor="start" x="70" y="-518" font-family="Helvetica,sans-Serif" font-size="10.00">router1</text>
<polygon fill="#ff9933" stroke="none" points="38,-481 38,-504 133,-504 133,-481 38,-481"/>
<polygon fill="none" stroke="black" points="38,-481 38,-504 133,-504 133,-481 38,-481"/>
<text text-anchor="start" x="55.5" y="-490" font-family="Helvetica,sans-Serif" font-size="10.00">172.24.4.3/24</text>
<polygon fill="#ff9933" stroke="none" points="38,-453 38,-476 133,-476 133,-453 38,-453"/>
<polygon fill="none" stroke="black" points="38,-453 38,-476 133,-476 133,-453 38,-453"/>
<text text-anchor="start" x="44.5" y="-462" font-family="Helvetica,sans-Serif" font-size="10.00">[2] qg&#45;757bf552&#45;73</text>
</g>
<!-- NetworkNode&#45;&gt;br_ex -->
<!-- network_br_int -->
<g id="node3" class="node"><title>network_br_int</title>
<polygon fill="white" stroke="none" points="32.5,-168 32.5,-368 243.5,-368 243.5,-168 32.5,-168"/>
<polygon fill="white" stroke="none" points="38,-341 38,-363 239,-363 239,-341 38,-341"/>
<text text-anchor="start" x="114" y="-349.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_int</text>
<polygon fill="#c079f3" stroke="none" points="38,-313 38,-336 133,-336 133,-313 38,-313"/>
<polygon fill="none" stroke="black" points="38,-313 38,-336 133,-336 133,-313 38,-313"/>
<text text-anchor="start" x="44.5" y="-322" font-family="Helvetica,sans-Serif" font-size="10.00">[8] qr&#45;43b83157&#45;3b</text>
<polygon fill="#c079f3" stroke="none" points="138,-313 138,-336 239,-336 239,-313 138,-313"/>
<polygon fill="none" stroke="black" points="138,-313 138,-336 239,-336 239,-313 138,-313"/>
<text text-anchor="start" x="144" y="-322" font-family="Helvetica,sans-Serif" font-size="10.00">[10] tap1e1c73c9&#45;35</text>
<polygon fill="#c079f3" stroke="none" points="38,-285 38,-308 133,-308 133,-285 38,-285"/>
<polygon fill="none" stroke="black" points="38,-285 38,-308 133,-308 133,-285 38,-285"/>
<text text-anchor="start" x="59.5" y="-294" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="138,-285 138,-308 239,-308 239,-285 138,-285"/>
<polygon fill="none" stroke="black" points="138,-285 138,-308 239,-308 239,-285 138,-285"/>
<text text-anchor="start" x="162.5" y="-294" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#c079f3" stroke="none" points="38,-257 38,-280 133,-280 133,-257 38,-257"/>
<polygon fill="none" stroke="black" points="38,-257 38,-280 133,-280 133,-257 38,-257"/>
<text text-anchor="start" x="58" y="-266" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.1/24</text>
<polygon fill="#c079f3" stroke="none" points="138,-257 138,-280 239,-280 239,-257 138,-257"/>
<polygon fill="none" stroke="black" points="138,-257 138,-280 239,-280 239,-257 138,-257"/>
<text text-anchor="start" x="161" y="-266" font-family="Helvetica,sans-Serif" font-size="10.00">10.10.0.5/24</text>
<polygon fill="#c079f3" stroke="none" points="38,-229 38,-252 239,-252 239,-229 38,-229"/>
<polygon fill="none" stroke="black" points="38,-229 38,-252 239,-252 239,-229 38,-229"/>
<text text-anchor="start" x="121" y="-238" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#ff9933" stroke="none" points="38,-201 38,-224 239,-224 239,-201 38,-201"/>
<polygon fill="none" stroke="black" points="38,-201 38,-224 239,-224 239,-201 38,-201"/>
<text text-anchor="start" x="123" y="-210" font-family="Helvetica,sans-Serif" font-size="10.00">router1</text>
<polygon fill="#ffcc00" stroke="none" points="38,-173 38,-196 239,-196 239,-173 38,-173"/>
<polygon fill="none" stroke="black" points="38,-173 38,-196 239,-196 239,-173 38,-173"/>
<text text-anchor="start" x="111" y="-182" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;tun</text>
</g>
<!-- br_ex&#45;&gt;network_br_int -->
<g id="edge3" class="edge"><title>br_ex:qg_757bf552_73:s&#45;&gt;network_br_int:qr_43b83157_3b:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M86,-452C86,-400.887 85,-388.113 85,-337"/>
</g>
<!-- network_br_tun -->
<g id="node4" class="node"><title>network_br_tun</title>
<polygon fill="white" stroke="none" points="99,-28 99,-88 179,-88 179,-28 99,-28"/>
<polygon fill="white" stroke="none" points="104,-61 104,-83 174,-83 174,-61 104,-61"/>
<text text-anchor="start" x="113" y="-69.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_tun</text>
<polygon fill="#ffcc00" stroke="none" points="104,-33 104,-56 174,-56 174,-33 104,-33"/>
<polygon fill="none" stroke="black" points="104,-33 104,-56 174,-56 174,-33 104,-33"/>
<text text-anchor="start" x="113" y="-42" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;int</text>
</g>
<!-- network_br_int&#45;&gt;network_br_tun -->
<g id="edge2" class="edge"><title>network_br_int:patch_tun:s&#45;&gt;network_br_tun:patch_int:n</title>
<path fill="none" stroke="#0066cc" stroke-width="4" d="M139,-172C139,-120.889 139,-108.111 139,-57"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.2 KiB

278
static/don/ping.dot Normal file
View File

@ -0,0 +1,278 @@
digraph DON_DON {
graph [fontsize=10 fontname="Helvetica"];
node [fontsize=10 fontname="Helvetica"];
rankdir = TB;
ranksep = 1;
concentrate = true;
compound = true;
edge [dir=none]
subgraph cluster_DONComputeNode {
style=filled
subgraph cluster_ComputeNode {
ComputeNode [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="red">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="yellow" PORT="ComputeNode">Compute Node</TD>
</TR>
</TABLE>>];
}
subgraph cluster_Nova {
style=filled
subgraph cluster_VMs {
VMs [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="7" BORDER="0" BGCOLOR="white" PORT="VMs">VMs</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">VM1-1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">VM1-2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">VM3-1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">VM3-2</TD>
<TD ROWSPAN="1" COLSPAN="3" BGCOLOR="#909090">VM4</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">private1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">private1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">private2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">private2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">public</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">private2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090">private1</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="10023">10.0.2.3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="10024">10.0.2.4</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="10033">10.0.3.3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="10034">10.0.3.4</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="1722445">172.24.4.5</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="10036">10.0.3.6</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="10026">10.0.2.6</TD>
</TR>
</TABLE>>];
}
subgraph cluster_LinuxBridge {
LinuxBridge [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="7" BORDER="0" BGCOLOR="white" PORT="LinuxBridge">Linux Bridge</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="tape0d697f2_cb">tape0d697f2-cb</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapbd4f1f72_5f">tapbd4f1f72-5f</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="tapbd96ca7d_5e">tapbd96ca7d-5e</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tap4441e3a6_f2">tap4441e3a6-f2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapce3d7b20_1d">tapce3d7b20-1d</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapf0841d56_02">tapf0841d56-02</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapfbb76083_60">tapfbb76083-60</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qbre0d697f2_cb">qbre0d697f2-cb</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qbrbd4f1f72_5f">qbrbd4f1f72-5f</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qbrbd96ca7d_5e">qbrbd96ca7d-5e</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qbr4441e3a6_f2">qbr4441e3a6-f2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qbrce3d7b20_1d">qbrce3d7b20-1d</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qbrf0841d56_02">qbrf0841d56-02</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qbrfbb76083_60">qbrfbb76083-60</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qvbe0d697f2_cb">qvbe0d697f2-cb</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvbbd4f1f72_5f">qvbbd4f1f72-5f</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qvbbd96ca7d_5e">qvbbd96ca7d-5e</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvb4441e3a6_f2">qvb4441e3a6-f2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvbce3d7b20_1d">qvbce3d7b20-1d</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvbf0841d56_02">qvbf0841d56-02</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvbfbb76083_60">qvbfbb76083-60</TD>
</TR>
</TABLE>>];
}
}
subgraph cluster_OVS {
style=filled
subgraph cluster_compute_br_int {
compute_br_int [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="7" BORDER="0" BGCOLOR="white" PORT="OVSbr_int">OVS br_int</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qvoe0d697f2_cb">[9] qvoe0d697f2-cb</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvobd4f1f72_5f">[10] qvobd4f1f72-5f</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qvobd96ca7d_5e">[11] qvobd96ca7d-5e</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvo4441e3a6_f2">[12] qvo4441e3a6-f2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvoce3d7b20_1d">[17] qvoce3d7b20-1d</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvof0841d56_02">[16] qvof0841d56-02</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvofbb76083_60">[15] qvofbb76083-60</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvoe0d697f2_cbtag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvobd4f1f72_5ftag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvobd96ca7d_5etag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvo4441e3a6_f2tag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvoce3d7b20_1dtag_4">VLAN tag:4</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvof0841d56_02tag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qvofbb76083_60tag_2">VLAN tag:2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="7" BGCOLOR="#909090" PORT="patch_tun">[1] patch-tun</TD>
</TR>
</TABLE>>];
}
subgraph cluster_compute_br_tun {
compute_br_tun [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="7" BORDER="0" BGCOLOR="white" PORT="OVSbr_tun">OVS br_tun</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="7" BGCOLOR="#909090" PORT="patch_int">[1] patch-int</TD>
</TR>
</TABLE>>];
}
}
ComputeNode:s -> VMs:n [color = "#909090", penwidth = "4", style="invis"]
VMs:10023:s -> LinuxBridge:tape0d697f2_cb:n [color = "#009900", penwidth = "4"]
VMs:10024:s -> LinuxBridge:tapbd4f1f72_5f:n [color = "#909090", penwidth = "4"]
VMs:10033:s -> LinuxBridge:tapbd96ca7d_5e:n [color = "#009900", penwidth = "4"]
VMs:10034:s -> LinuxBridge:tap4441e3a6_f2:n [color = "#909090", penwidth = "4"]
VMs:1722445:s -> LinuxBridge:tapce3d7b20_1d:n [color = "#909090", penwidth = "4"]
VMs:10036:s -> LinuxBridge:tapf0841d56_02:n [color = "#909090", penwidth = "4"]
VMs:10026:s -> LinuxBridge:tapfbb76083_60:n [color = "#909090", penwidth = "4"]
LinuxBridge:qvbe0d697f2_cb:s -> compute_br_int:qvoe0d697f2_cb:n [color = "#009900", penwidth = "4"]
LinuxBridge:qvbbd4f1f72_5f:s -> compute_br_int:qvobd4f1f72_5f:n [color = "#909090", penwidth = "4"]
LinuxBridge:qvbbd96ca7d_5e:s -> compute_br_int:qvobd96ca7d_5e:n [color = "#009900", penwidth = "4"]
LinuxBridge:qvb4441e3a6_f2:s -> compute_br_int:qvo4441e3a6_f2:n [color = "#909090", penwidth = "4"]
LinuxBridge:qvbce3d7b20_1d:s -> compute_br_int:qvoce3d7b20_1d:n [color = "#909090", penwidth = "4"]
LinuxBridge:qvbf0841d56_02:s -> compute_br_int:qvof0841d56_02:n [color = "#909090", penwidth = "4"]
LinuxBridge:qvbfbb76083_60:s -> compute_br_int:qvofbb76083_60:n [color = "#909090", penwidth = "4"]
compute_br_int:patch_tun:s -> compute_br_tun:patch_int:n [color = "#909090", penwidth = "4"]
}
subgraph cluster_DONNetworkNode {
style=filled
subgraph cluster_NetworkNode {
NetworkNode [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="red">
<TR>
<TD COLSPAN="1" BORDER="0" BGCOLOR="yellow" PORT="NetworkNode">Network Node</TD>
</TR>
</TABLE>>];
}
subgraph cluster_OVS {
style=filled
subgraph cluster_br_ex {
br_ex [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="2" BORDER="0" BGCOLOR="white" PORT="OVSbr_ex">OVS br_ex</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="router1">router1</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="router2">router2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="172.24.4.3/24">172.24.4.3/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="172.24.4.4/24">172.24.4.4/24</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qg_eb8796fb_83">[2] qg-eb8796fb-83</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qg_e2b1b0d3_a8">[3] qg-e2b1b0d3-a8</TD>
</TR>
</TABLE>>];
}
subgraph cluster_network_br_int {
network_br_int [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="8" BORDER="0" BGCOLOR="white" PORT="OVSbr_int">OVS br_int</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qr_09a15e37_ca">[8] qr-09a15e37-ca</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd0828ef0_eb">[6] tapd0828ef0-eb</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#b2f379" PORT="qr_622abba5_e2">[7] qr-622abba5-e2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd6f091a2_c0">[5] tapd6f091a2-c0</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_361be2af_e5">[13] qr-361be2af-e5</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd6f091a2_c0">[5] tapd6f091a2-c0</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_b66b902a_36">[14] qr-b66b902a-36</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd0828ef0_eb">[6] tapd0828ef0-eb</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_09a15e37_catag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd0828ef0_ebtag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_622abba5_e2tag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd6f091a2_c0tag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_361be2af_e5tag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd6f091a2_c0tag_2">VLAN tag:2</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_b66b902a_36tag_3">VLAN tag:3</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd0828ef0_ebtag_3">VLAN tag:3</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_09a15e37_ca10.0.3.1/24">10.0.3.1/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd0828ef0_eb10.0.3.2/24">10.0.3.2/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_622abba5_e210.0.2.1/24">10.0.2.1/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd6f091a2_c010.0.2.2/24">10.0.2.2/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_361be2af_e510.0.2.5/24">10.0.2.5/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd6f091a2_c010.0.2.2/24">10.0.2.2/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="qr_b66b902a_3610.0.3.5/24">10.0.3.5/24</TD>
<TD ROWSPAN="1" COLSPAN="1" BGCOLOR="#909090" PORT="tapd0828ef0_eb10.0.3.2/24">10.0.3.2/24</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#909090" PORT="private2">private2</TD>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#909090" PORT="private1">private1</TD>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#909090" PORT="private1">private1</TD>
<TD ROWSPAN="1" COLSPAN="2" BGCOLOR="#909090" PORT="private2">private2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="4" BGCOLOR="#909090" PORT="router1">router1</TD>
<TD ROWSPAN="1" COLSPAN="4" BGCOLOR="#909090" PORT="router2">router2</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="8" BGCOLOR="#909090" PORT="patch_tun">[1] patch-tun</TD>
</TR>
</TABLE>>];
}
subgraph cluster_network_br_tun {
network_br_tun [ shape = plaintext, label = <
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="5" CELLPADDING="5" BGCOLOR="white">
<TR>
<TD COLSPAN="7" BORDER="0" BGCOLOR="white" PORT="OVSbr_tun">OVS br_tun</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="7" BGCOLOR="#909090" PORT="patch_int">[1] patch-int</TD>
</TR>
</TABLE>>];
}
}
NetworkNode:s -> br_ex:n [color = "#909090", penwidth = "4", style="invis"]
network_br_int:patch_tun:s -> network_br_tun:patch_int:n [color = "#909090", penwidth = "4"]
br_ex:qg_e2b1b0d3_a8:s -> network_br_int:qr_361be2af_e5:n [color = "#909090", penwidth = "4"]
br_ex:qg_e2b1b0d3_a8:s -> network_br_int:qr_b66b902a_36:n [color = "#909090", penwidth = "4"]
br_ex:qg_eb8796fb_83:s -> network_br_int:qr_09a15e37_ca:n [color = "#909090", penwidth = "4"]
br_ex:qg_eb8796fb_83:s -> network_br_int:qr_622abba5_e2:n [color = "#909090", penwidth = "4"]
}
}

473
static/don/ping.svg Normal file
View File

@ -0,0 +1,473 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.36.0 (20140111.2315)
-->
<!-- Title: DON_DON Pages: 1 -->
<svg width="1710pt" height="916pt"
viewBox="0.00 0.00 1710.00 916.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 912)">
<title>DON_DON</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-912 1706,-912 1706,4 -4,4"/>
<g id="clust1" class="cluster"><title>cluster_DONComputeNode</title>
<polygon fill="lightgrey" stroke="black" points="8,-8 8,-900 816,-900 816,-8 8,-8"/>
</g>
<g id="clust2" class="cluster"><title>cluster_ComputeNode</title>
<polygon fill="lightgrey" stroke="black" points="352,-836 352,-892 472,-892 472,-836 352,-836"/>
</g>
<g id="clust3" class="cluster"><title>cluster_Nova</title>
<polygon fill="lightgrey" stroke="black" points="79,-394 79,-788 741,-788 741,-394 79,-394"/>
</g>
<g id="clust4" class="cluster"><title>cluster_VMs</title>
<polygon fill="lightgrey" stroke="black" points="202,-640 202,-780 622,-780 622,-640 202,-640"/>
</g>
<g id="clust5" class="cluster"><title>cluster_LinuxBridge</title>
<polygon fill="lightgrey" stroke="black" points="87,-402 87,-542 733,-542 733,-402 87,-402"/>
</g>
<g id="clust6" class="cluster"><title>cluster_OVS</title>
<polygon fill="lightgrey" stroke="black" points="16,-16 16,-312 808,-312 808,-16 16,-16"/>
</g>
<g id="clust7" class="cluster"><title>cluster_compute_br_int</title>
<polygon fill="lightgrey" stroke="black" points="24,-164 24,-304 800,-304 800,-164 24,-164"/>
</g>
<g id="clust8" class="cluster"><title>cluster_compute_br_tun</title>
<polygon fill="lightgrey" stroke="black" points="343,-24 343,-108 481,-108 481,-24 343,-24"/>
</g>
<g id="clust9" class="cluster"><title>cluster_DONNetworkNode</title>
<polygon fill="lightgrey" stroke="black" points="824,-176 824,-900 1694,-900 1694,-176 824,-176"/>
</g>
<g id="clust11" class="cluster"><title>cluster_OVS</title>
<polygon fill="lightgrey" stroke="black" points="832,-184 832,-788 1686,-788 1686,-184 832,-184"/>
</g>
<g id="clust12" class="cluster"><title>cluster_br_ex</title>
<polygon fill="lightgrey" stroke="black" points="1088,-640 1088,-780 1326,-780 1326,-640 1088,-640"/>
</g>
<g id="clust13" class="cluster"><title>cluster_network_br_int</title>
<polygon fill="lightgrey" stroke="black" points="840,-360 840,-584 1678,-584 1678,-360 840,-360"/>
</g>
<g id="clust14" class="cluster"><title>cluster_network_br_tun</title>
<polygon fill="lightgrey" stroke="black" points="1189,-192 1189,-276 1327,-276 1327,-192 1189,-192"/>
</g>
<g id="clust10" class="cluster"><title>cluster_NetworkNode</title>
<polygon fill="lightgrey" stroke="black" points="1148,-836 1148,-892 1266,-892 1266,-836 1148,-836"/>
</g>
<!-- ComputeNode -->
<g id="node1" class="node"><title>ComputeNode</title>
<polygon fill="red" stroke="none" points="368,-848 368,-880 456,-880 456,-848 368,-848"/>
<polygon fill="yellow" stroke="none" points="373,-853 373,-875 451,-875 451,-853 373,-853"/>
<text text-anchor="start" x="378.5" y="-861.5" font-family="Helvetica,sans-Serif" font-size="10.00">Compute Node</text>
</g>
<!-- VMs -->
<g id="node2" class="node"><title>VMs</title>
<polygon fill="white" stroke="none" points="218.5,-652 218.5,-768 605.5,-768 605.5,-652 218.5,-652"/>
<polygon fill="white" stroke="none" points="224,-741 224,-763 601,-763 601,-741 224,-741"/>
<text text-anchor="start" x="402" y="-749.5" font-family="Helvetica,sans-Serif" font-size="10.00">VMs</text>
<polygon fill="#909090" stroke="none" points="224,-713 224,-736 273,-736 273,-713 224,-713"/>
<polygon fill="none" stroke="black" points="224,-713 224,-736 273,-736 273,-713 224,-713"/>
<text text-anchor="start" x="234" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">VM1&#45;1</text>
<polygon fill="#909090" stroke="none" points="278,-713 278,-736 326,-736 326,-713 278,-713"/>
<polygon fill="none" stroke="black" points="278,-713 278,-736 326,-736 326,-713 278,-713"/>
<text text-anchor="start" x="287.5" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">VM1&#45;2</text>
<polygon fill="#909090" stroke="none" points="331,-713 331,-736 379,-736 379,-713 331,-713"/>
<polygon fill="none" stroke="black" points="331,-713 331,-736 379,-736 379,-713 331,-713"/>
<text text-anchor="start" x="340.5" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">VM3&#45;1</text>
<polygon fill="#909090" stroke="none" points="384,-713 384,-736 432,-736 432,-713 384,-713"/>
<polygon fill="none" stroke="black" points="384,-713 384,-736 432,-736 432,-713 384,-713"/>
<text text-anchor="start" x="393.5" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">VM3&#45;2</text>
<polygon fill="#909090" stroke="none" points="437,-713 437,-736 601,-736 601,-713 437,-713"/>
<polygon fill="none" stroke="black" points="437,-713 437,-736 601,-736 601,-713 437,-713"/>
<text text-anchor="start" x="508.5" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">VM4</text>
<polygon fill="#909090" stroke="none" points="224,-685 224,-708 273,-708 273,-685 224,-685"/>
<polygon fill="none" stroke="black" points="224,-685 224,-708 273,-708 273,-685 224,-685"/>
<text text-anchor="start" x="231" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#909090" stroke="none" points="278,-685 278,-708 326,-708 326,-685 278,-685"/>
<polygon fill="none" stroke="black" points="278,-685 278,-708 326,-708 326,-685 278,-685"/>
<text text-anchor="start" x="284.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#909090" stroke="none" points="331,-685 331,-708 379,-708 379,-685 331,-685"/>
<polygon fill="none" stroke="black" points="331,-685 331,-708 379,-708 379,-685 331,-685"/>
<text text-anchor="start" x="337.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private2</text>
<polygon fill="#909090" stroke="none" points="384,-685 384,-708 432,-708 432,-685 384,-685"/>
<polygon fill="none" stroke="black" points="384,-685 384,-708 432,-708 432,-685 384,-685"/>
<text text-anchor="start" x="390.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private2</text>
<polygon fill="#909090" stroke="none" points="437,-685 437,-708 495,-708 495,-685 437,-685"/>
<polygon fill="none" stroke="black" points="437,-685 437,-708 495,-708 495,-685 437,-685"/>
<text text-anchor="start" x="453" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">public</text>
<polygon fill="#909090" stroke="none" points="500,-685 500,-708 548,-708 548,-685 500,-685"/>
<polygon fill="none" stroke="black" points="500,-685 500,-708 548,-708 548,-685 500,-685"/>
<text text-anchor="start" x="506.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private2</text>
<polygon fill="#909090" stroke="none" points="553,-685 553,-708 601,-708 601,-685 553,-685"/>
<polygon fill="none" stroke="black" points="553,-685 553,-708 601,-708 601,-685 553,-685"/>
<text text-anchor="start" x="559.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#b2f379" stroke="none" points="224,-657 224,-680 273,-680 273,-657 224,-657"/>
<polygon fill="none" stroke="black" points="224,-657 224,-680 273,-680 273,-657 224,-657"/>
<text text-anchor="start" x="230.5" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.3</text>
<polygon fill="#909090" stroke="none" points="278,-657 278,-680 326,-680 326,-657 278,-657"/>
<polygon fill="none" stroke="black" points="278,-657 278,-680 326,-680 326,-657 278,-657"/>
<text text-anchor="start" x="284" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.4</text>
<polygon fill="#b2f379" stroke="none" points="331,-657 331,-680 379,-680 379,-657 331,-657"/>
<polygon fill="none" stroke="black" points="331,-657 331,-680 379,-680 379,-657 331,-657"/>
<text text-anchor="start" x="337" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.3</text>
<polygon fill="#909090" stroke="none" points="384,-657 384,-680 432,-680 432,-657 384,-657"/>
<polygon fill="none" stroke="black" points="384,-657 384,-680 432,-680 432,-657 384,-657"/>
<text text-anchor="start" x="390" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.4</text>
<polygon fill="#909090" stroke="none" points="437,-657 437,-680 495,-680 495,-657 437,-657"/>
<polygon fill="none" stroke="black" points="437,-657 437,-680 495,-680 495,-657 437,-657"/>
<text text-anchor="start" x="443" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">172.24.4.5</text>
<polygon fill="#909090" stroke="none" points="500,-657 500,-680 548,-680 548,-657 500,-657"/>
<polygon fill="none" stroke="black" points="500,-657 500,-680 548,-680 548,-657 500,-657"/>
<text text-anchor="start" x="506" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.6</text>
<polygon fill="#909090" stroke="none" points="553,-657 553,-680 601,-680 601,-657 553,-657"/>
<polygon fill="none" stroke="black" points="553,-657 553,-680 601,-680 601,-657 553,-657"/>
<text text-anchor="start" x="559" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.6</text>
</g>
<!-- ComputeNode&#45;&gt;VMs -->
<!-- LinuxBridge -->
<g id="node3" class="node"><title>LinuxBridge</title>
<polygon fill="white" stroke="none" points="103,-414 103,-530 717,-530 717,-414 103,-414"/>
<polygon fill="white" stroke="none" points="108,-503 108,-525 712,-525 712,-503 108,-503"/>
<text text-anchor="start" x="382.5" y="-511.5" font-family="Helvetica,sans-Serif" font-size="10.00">Linux Bridge</text>
<polygon fill="#b2f379" stroke="none" points="108,-475 108,-498 191,-498 191,-475 108,-475"/>
<polygon fill="none" stroke="black" points="108,-475 108,-498 191,-498 191,-475 108,-475"/>
<text text-anchor="start" x="116" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tape0d697f2&#45;cb</text>
<polygon fill="#909090" stroke="none" points="196,-475 196,-498 273,-498 273,-475 196,-475"/>
<polygon fill="none" stroke="black" points="196,-475 196,-498 273,-498 273,-475 196,-475"/>
<text text-anchor="start" x="203" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tapbd4f1f72&#45;5f</text>
<polygon fill="#b2f379" stroke="none" points="278,-475 278,-498 362,-498 362,-475 278,-475"/>
<polygon fill="none" stroke="black" points="278,-475 278,-498 362,-498 362,-475 278,-475"/>
<text text-anchor="start" x="285" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tapbd96ca7d&#45;5e</text>
<polygon fill="#909090" stroke="none" points="367,-475 367,-498 449,-498 449,-475 367,-475"/>
<polygon fill="none" stroke="black" points="367,-475 367,-498 449,-498 449,-475 367,-475"/>
<text text-anchor="start" x="374.5" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tap4441e3a6&#45;f2</text>
<polygon fill="#909090" stroke="none" points="454,-475 454,-498 538,-498 538,-475 454,-475"/>
<polygon fill="none" stroke="black" points="454,-475 454,-498 538,-498 538,-475 454,-475"/>
<text text-anchor="start" x="461" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tapce3d7b20&#45;1d</text>
<polygon fill="#909090" stroke="none" points="543,-475 543,-498 625,-498 625,-475 543,-475"/>
<polygon fill="none" stroke="black" points="543,-475 543,-498 625,-498 625,-475 543,-475"/>
<text text-anchor="start" x="550.5" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tapf0841d56&#45;02</text>
<polygon fill="#909090" stroke="none" points="630,-475 630,-498 712,-498 712,-475 630,-475"/>
<polygon fill="none" stroke="black" points="630,-475 630,-498 712,-498 712,-475 630,-475"/>
<text text-anchor="start" x="637.5" y="-484" font-family="Helvetica,sans-Serif" font-size="10.00">tapfbb76083&#45;60</text>
<polygon fill="#b2f379" stroke="none" points="108,-447 108,-470 191,-470 191,-447 108,-447"/>
<polygon fill="none" stroke="black" points="108,-447 108,-470 191,-470 191,-447 108,-447"/>
<text text-anchor="start" x="116" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbre0d697f2&#45;cb</text>
<polygon fill="#909090" stroke="none" points="196,-447 196,-470 273,-470 273,-447 196,-447"/>
<polygon fill="none" stroke="black" points="196,-447 196,-470 273,-470 273,-447 196,-447"/>
<text text-anchor="start" x="203" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbrbd4f1f72&#45;5f</text>
<polygon fill="#b2f379" stroke="none" points="278,-447 278,-470 362,-470 362,-447 278,-447"/>
<polygon fill="none" stroke="black" points="278,-447 278,-470 362,-470 362,-447 278,-447"/>
<text text-anchor="start" x="285" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbrbd96ca7d&#45;5e</text>
<polygon fill="#909090" stroke="none" points="367,-447 367,-470 449,-470 449,-447 367,-447"/>
<polygon fill="none" stroke="black" points="367,-447 367,-470 449,-470 449,-447 367,-447"/>
<text text-anchor="start" x="374.5" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbr4441e3a6&#45;f2</text>
<polygon fill="#909090" stroke="none" points="454,-447 454,-470 538,-470 538,-447 454,-447"/>
<polygon fill="none" stroke="black" points="454,-447 454,-470 538,-470 538,-447 454,-447"/>
<text text-anchor="start" x="461" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbrce3d7b20&#45;1d</text>
<polygon fill="#909090" stroke="none" points="543,-447 543,-470 625,-470 625,-447 543,-447"/>
<polygon fill="none" stroke="black" points="543,-447 543,-470 625,-470 625,-447 543,-447"/>
<text text-anchor="start" x="550.5" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbrf0841d56&#45;02</text>
<polygon fill="#909090" stroke="none" points="630,-447 630,-470 712,-470 712,-447 630,-447"/>
<polygon fill="none" stroke="black" points="630,-447 630,-470 712,-470 712,-447 630,-447"/>
<text text-anchor="start" x="637.5" y="-456" font-family="Helvetica,sans-Serif" font-size="10.00">qbrfbb76083&#45;60</text>
<polygon fill="#b2f379" stroke="none" points="108,-419 108,-442 191,-442 191,-419 108,-419"/>
<polygon fill="none" stroke="black" points="108,-419 108,-442 191,-442 191,-419 108,-419"/>
<text text-anchor="start" x="114.5" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvbe0d697f2&#45;cb</text>
<polygon fill="#909090" stroke="none" points="196,-419 196,-442 273,-442 273,-419 196,-419"/>
<polygon fill="none" stroke="black" points="196,-419 196,-442 273,-442 273,-419 196,-419"/>
<text text-anchor="start" x="202" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvbbd4f1f72&#45;5f</text>
<polygon fill="#b2f379" stroke="none" points="278,-419 278,-442 362,-442 362,-419 278,-419"/>
<polygon fill="none" stroke="black" points="278,-419 278,-442 362,-442 362,-419 278,-419"/>
<text text-anchor="start" x="284" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvbbd96ca7d&#45;5e</text>
<polygon fill="#909090" stroke="none" points="367,-419 367,-442 449,-442 449,-419 367,-419"/>
<polygon fill="none" stroke="black" points="367,-419 367,-442 449,-442 449,-419 367,-419"/>
<text text-anchor="start" x="373" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvb4441e3a6&#45;f2</text>
<polygon fill="#909090" stroke="none" points="454,-419 454,-442 538,-442 538,-419 454,-419"/>
<polygon fill="none" stroke="black" points="454,-419 454,-442 538,-442 538,-419 454,-419"/>
<text text-anchor="start" x="460" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvbce3d7b20&#45;1d</text>
<polygon fill="#909090" stroke="none" points="543,-419 543,-442 625,-442 625,-419 543,-419"/>
<polygon fill="none" stroke="black" points="543,-419 543,-442 625,-442 625,-419 543,-419"/>
<text text-anchor="start" x="549" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvbf0841d56&#45;02</text>
<polygon fill="#909090" stroke="none" points="630,-419 630,-442 712,-442 712,-419 630,-419"/>
<polygon fill="none" stroke="black" points="630,-419 630,-442 712,-442 712,-419 630,-419"/>
<text text-anchor="start" x="636" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00">qvbfbb76083&#45;60</text>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge2" class="edge"><title>VMs:10023:s&#45;&gt;LinuxBridge:tape0d697f2_cb:n</title>
<path fill="none" stroke="#009900" stroke-width="4" d="M248,-656C248,-573.508 149,-581.492 149,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge3" class="edge"><title>VMs:10024:s&#45;&gt;LinuxBridge:tapbd4f1f72_5f:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M302,-656C302,-579.958 234,-575.042 234,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge4" class="edge"><title>VMs:10033:s&#45;&gt;LinuxBridge:tapbd96ca7d_5e:n</title>
<path fill="none" stroke="#009900" stroke-width="4" d="M355,-656C355,-584.509 320,-570.491 320,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge5" class="edge"><title>VMs:10034:s&#45;&gt;LinuxBridge:tap4441e3a6_f2:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M408,-656C408,-586.222 408,-568.778 408,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge6" class="edge"><title>VMs:1722445:s&#45;&gt;LinuxBridge:tapce3d7b20_1d:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M466,-656C466,-584.96 496,-570.04 496,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge7" class="edge"><title>VMs:10036:s&#45;&gt;LinuxBridge:tapf0841d56_02:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M524,-656C524,-581.3 584,-573.7 584,-499"/>
</g>
<!-- VMs&#45;&gt;LinuxBridge -->
<g id="edge8" class="edge"><title>VMs:10026:s&#45;&gt;LinuxBridge:tapfbb76083_60:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M577,-656C577,-574.672 671,-580.328 671,-499"/>
</g>
<!-- compute_br_int -->
<g id="node4" class="node"><title>compute_br_int</title>
<polygon fill="white" stroke="none" points="40.5,-176 40.5,-292 783.5,-292 783.5,-176 40.5,-176"/>
<polygon fill="white" stroke="none" points="46,-265 46,-287 779,-287 779,-265 46,-265"/>
<text text-anchor="start" x="388" y="-273.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_int</text>
<polygon fill="#b2f379" stroke="none" points="46,-237 46,-260 143,-260 143,-237 46,-237"/>
<polygon fill="none" stroke="black" points="46,-237 46,-260 143,-260 143,-237 46,-237"/>
<text text-anchor="start" x="52.5" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[9] qvoe0d697f2&#45;cb</text>
<polygon fill="#909090" stroke="none" points="148,-237 148,-260 245,-260 245,-237 148,-237"/>
<polygon fill="none" stroke="black" points="148,-237 148,-260 245,-260 245,-237 148,-237"/>
<text text-anchor="start" x="154" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[10] qvobd4f1f72&#45;5f</text>
<polygon fill="#b2f379" stroke="none" points="250,-237 250,-260 353,-260 353,-237 250,-237"/>
<polygon fill="none" stroke="black" points="250,-237 250,-260 353,-260 353,-237 250,-237"/>
<text text-anchor="start" x="256" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[11] qvobd96ca7d&#45;5e</text>
<polygon fill="#909090" stroke="none" points="358,-237 358,-260 459,-260 459,-237 358,-237"/>
<polygon fill="none" stroke="black" points="358,-237 358,-260 459,-260 459,-237 358,-237"/>
<text text-anchor="start" x="364" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[12] qvo4441e3a6&#45;f2</text>
<polygon fill="#909090" stroke="none" points="464,-237 464,-260 567,-260 567,-237 464,-237"/>
<polygon fill="none" stroke="black" points="464,-237 464,-260 567,-260 567,-237 464,-237"/>
<text text-anchor="start" x="470" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[17] qvoce3d7b20&#45;1d</text>
<polygon fill="#909090" stroke="none" points="572,-237 572,-260 673,-260 673,-237 572,-237"/>
<polygon fill="none" stroke="black" points="572,-237 572,-260 673,-260 673,-237 572,-237"/>
<text text-anchor="start" x="578" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[16] qvof0841d56&#45;02</text>
<polygon fill="#909090" stroke="none" points="678,-237 678,-260 779,-260 779,-237 678,-237"/>
<polygon fill="none" stroke="black" points="678,-237 678,-260 779,-260 779,-237 678,-237"/>
<text text-anchor="start" x="684" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00">[15] qvofbb76083&#45;60</text>
<polygon fill="#909090" stroke="none" points="46,-209 46,-232 143,-232 143,-209 46,-209"/>
<polygon fill="none" stroke="black" points="46,-209 46,-232 143,-232 143,-209 46,-209"/>
<text text-anchor="start" x="68.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#909090" stroke="none" points="148,-209 148,-232 245,-232 245,-209 148,-209"/>
<polygon fill="none" stroke="black" points="148,-209 148,-232 245,-232 245,-209 148,-209"/>
<text text-anchor="start" x="170.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#909090" stroke="none" points="250,-209 250,-232 353,-232 353,-209 250,-209"/>
<polygon fill="none" stroke="black" points="250,-209 250,-232 353,-232 353,-209 250,-209"/>
<text text-anchor="start" x="275.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#909090" stroke="none" points="358,-209 358,-232 459,-232 459,-209 358,-209"/>
<polygon fill="none" stroke="black" points="358,-209 358,-232 459,-232 459,-209 358,-209"/>
<text text-anchor="start" x="382.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#909090" stroke="none" points="464,-209 464,-232 567,-232 567,-209 464,-209"/>
<polygon fill="none" stroke="black" points="464,-209 464,-232 567,-232 567,-209 464,-209"/>
<text text-anchor="start" x="489.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:4</text>
<polygon fill="#909090" stroke="none" points="572,-209 572,-232 673,-232 673,-209 572,-209"/>
<polygon fill="none" stroke="black" points="572,-209 572,-232 673,-232 673,-209 572,-209"/>
<text text-anchor="start" x="596.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#909090" stroke="none" points="678,-209 678,-232 779,-232 779,-209 678,-209"/>
<polygon fill="none" stroke="black" points="678,-209 678,-232 779,-232 779,-209 678,-209"/>
<text text-anchor="start" x="702.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#909090" stroke="none" points="46,-181 46,-204 779,-204 779,-181 46,-181"/>
<polygon fill="none" stroke="black" points="46,-181 46,-204 779,-204 779,-181 46,-181"/>
<text text-anchor="start" x="385" y="-190" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;tun</text>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge9" class="edge"><title>LinuxBridge:qvbe0d697f2_cb:s&#45;&gt;compute_br_int:qvoe0d697f2_cb:n</title>
<path fill="none" stroke="#009900" stroke-width="4" d="M149,-418C149,-344.064 94,-334.936 94,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge10" class="edge"><title>LinuxBridge:qvbbd4f1f72_5f:s&#45;&gt;compute_br_int:qvobd4f1f72_5f:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M234,-418C234,-346.207 196,-332.793 196,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge11" class="edge"><title>LinuxBridge:qvbbd96ca7d_5e:s&#45;&gt;compute_br_int:qvobd96ca7d_5e:n</title>
<path fill="none" stroke="#009900" stroke-width="4" d="M320,-418C320,-347.713 301,-331.287 301,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge12" class="edge"><title>LinuxBridge:qvb4441e3a6_f2:s&#45;&gt;compute_br_int:qvo4441e3a6_f2:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M408,-418C408,-348.222 408,-330.778 408,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge13" class="edge"><title>LinuxBridge:qvbce3d7b20_1d:s&#45;&gt;compute_br_int:qvoce3d7b20_1d:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M496,-418C496,-347.658 516,-331.342 516,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge14" class="edge"><title>LinuxBridge:qvbf0841d56_02:s&#45;&gt;compute_br_int:qvof0841d56_02:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M584,-418C584,-346.102 623,-332.898 623,-261"/>
</g>
<!-- LinuxBridge&#45;&gt;compute_br_int -->
<g id="edge15" class="edge"><title>LinuxBridge:qvbfbb76083_60:s&#45;&gt;compute_br_int:qvofbb76083_60:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M671,-418C671,-343.613 729,-335.387 729,-261"/>
</g>
<!-- compute_br_tun -->
<g id="node5" class="node"><title>compute_br_tun</title>
<polygon fill="white" stroke="none" points="359.5,-36 359.5,-96 464.5,-96 464.5,-36 359.5,-36"/>
<polygon fill="white" stroke="none" points="365,-69 365,-91 460,-91 460,-69 365,-69"/>
<text text-anchor="start" x="386.5" y="-77.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_tun</text>
<polygon fill="#909090" stroke="none" points="365,-41 365,-64 460,-64 460,-41 365,-41"/>
<polygon fill="none" stroke="black" points="365,-41 365,-64 460,-64 460,-41 365,-41"/>
<text text-anchor="start" x="386.5" y="-50" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;int</text>
</g>
<!-- compute_br_int&#45;&gt;compute_br_tun -->
<g id="edge16" class="edge"><title>compute_br_int:patch_tun:s&#45;&gt;compute_br_tun:patch_int:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M413,-180C413,-128.889 413,-116.111 413,-65"/>
</g>
<!-- NetworkNode -->
<g id="node6" class="node"><title>NetworkNode</title>
<polygon fill="red" stroke="none" points="1164.5,-848 1164.5,-880 1249.5,-880 1249.5,-848 1164.5,-848"/>
<polygon fill="yellow" stroke="none" points="1170,-853 1170,-875 1245,-875 1245,-853 1170,-853"/>
<text text-anchor="start" x="1175.5" y="-861.5" font-family="Helvetica,sans-Serif" font-size="10.00">Network Node</text>
</g>
<!-- br_ex -->
<g id="node7" class="node"><title>br_ex</title>
<polygon fill="white" stroke="none" points="1104,-652 1104,-768 1310,-768 1310,-652 1104,-652"/>
<polygon fill="white" stroke="none" points="1109,-741 1109,-763 1305,-763 1305,-741 1109,-741"/>
<text text-anchor="start" x="1182.5" y="-749.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_ex</text>
<polygon fill="#909090" stroke="none" points="1109,-713 1109,-736 1204,-736 1204,-713 1109,-713"/>
<polygon fill="none" stroke="black" points="1109,-713 1109,-736 1204,-736 1204,-713 1109,-713"/>
<text text-anchor="start" x="1141" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">router1</text>
<polygon fill="#909090" stroke="none" points="1209,-713 1209,-736 1305,-736 1305,-713 1209,-713"/>
<polygon fill="none" stroke="black" points="1209,-713 1209,-736 1305,-736 1305,-713 1209,-713"/>
<text text-anchor="start" x="1241.5" y="-722" font-family="Helvetica,sans-Serif" font-size="10.00">router2</text>
<polygon fill="#909090" stroke="none" points="1109,-685 1109,-708 1204,-708 1204,-685 1109,-685"/>
<polygon fill="none" stroke="black" points="1109,-685 1109,-708 1204,-708 1204,-685 1109,-685"/>
<text text-anchor="start" x="1126.5" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">172.24.4.3/24</text>
<polygon fill="#909090" stroke="none" points="1209,-685 1209,-708 1305,-708 1305,-685 1209,-685"/>
<polygon fill="none" stroke="black" points="1209,-685 1209,-708 1305,-708 1305,-685 1209,-685"/>
<text text-anchor="start" x="1227" y="-694" font-family="Helvetica,sans-Serif" font-size="10.00">172.24.4.4/24</text>
<polygon fill="#909090" stroke="none" points="1109,-657 1109,-680 1204,-680 1204,-657 1109,-657"/>
<polygon fill="none" stroke="black" points="1109,-657 1109,-680 1204,-680 1204,-657 1109,-657"/>
<text text-anchor="start" x="1115.5" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">[2] qg&#45;eb8796fb&#45;83</text>
<polygon fill="#909090" stroke="none" points="1209,-657 1209,-680 1305,-680 1305,-657 1209,-657"/>
<polygon fill="none" stroke="black" points="1209,-657 1209,-680 1305,-680 1305,-657 1209,-657"/>
<text text-anchor="start" x="1215" y="-666" font-family="Helvetica,sans-Serif" font-size="10.00">[3] qg&#45;e2b1b0d3&#45;a8</text>
</g>
<!-- NetworkNode&#45;&gt;br_ex -->
<!-- network_br_int -->
<g id="node8" class="node"><title>network_br_int</title>
<polygon fill="white" stroke="none" points="856,-372 856,-572 1662,-572 1662,-372 856,-372"/>
<polygon fill="white" stroke="none" points="861,-545 861,-567 1657,-567 1657,-545 861,-545"/>
<text text-anchor="start" x="1234.5" y="-553.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_int</text>
<polygon fill="#b2f379" stroke="none" points="861,-517 861,-540 956,-540 956,-517 861,-517"/>
<polygon fill="none" stroke="black" points="861,-517 861,-540 956,-540 956,-517 861,-517"/>
<text text-anchor="start" x="867.5" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[8] qr&#45;09a15e37&#45;ca</text>
<polygon fill="#909090" stroke="none" points="961,-517 961,-540 1055,-540 1055,-517 961,-517"/>
<polygon fill="none" stroke="black" points="961,-517 961,-540 1055,-540 1055,-517 961,-517"/>
<text text-anchor="start" x="967" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[6] tapd0828ef0&#45;eb</text>
<polygon fill="#b2f379" stroke="none" points="1060,-517 1060,-540 1154,-540 1154,-517 1060,-517"/>
<polygon fill="none" stroke="black" points="1060,-517 1060,-540 1154,-540 1154,-517 1060,-517"/>
<text text-anchor="start" x="1066" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[7] qr&#45;622abba5&#45;e2</text>
<polygon fill="#909090" stroke="none" points="1159,-517 1159,-540 1253,-540 1253,-517 1159,-517"/>
<polygon fill="none" stroke="black" points="1159,-517 1159,-540 1253,-540 1253,-517 1159,-517"/>
<text text-anchor="start" x="1165" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[5] tapd6f091a2&#45;c0</text>
<polygon fill="#909090" stroke="none" points="1258,-517 1258,-540 1355,-540 1355,-517 1258,-517"/>
<polygon fill="none" stroke="black" points="1258,-517 1258,-540 1355,-540 1355,-517 1258,-517"/>
<text text-anchor="start" x="1264" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[13] qr&#45;361be2af&#45;e5</text>
<polygon fill="#909090" stroke="none" points="1360,-517 1360,-540 1454,-540 1454,-517 1360,-517"/>
<polygon fill="none" stroke="black" points="1360,-517 1360,-540 1454,-540 1454,-517 1360,-517"/>
<text text-anchor="start" x="1366" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[5] tapd6f091a2&#45;c0</text>
<polygon fill="#909090" stroke="none" points="1459,-517 1459,-540 1558,-540 1558,-517 1459,-517"/>
<polygon fill="none" stroke="black" points="1459,-517 1459,-540 1558,-540 1558,-517 1459,-517"/>
<text text-anchor="start" x="1465" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[14] qr&#45;b66b902a&#45;36</text>
<polygon fill="#909090" stroke="none" points="1563,-517 1563,-540 1657,-540 1657,-517 1563,-517"/>
<polygon fill="none" stroke="black" points="1563,-517 1563,-540 1657,-540 1657,-517 1563,-517"/>
<text text-anchor="start" x="1569" y="-526" font-family="Helvetica,sans-Serif" font-size="10.00">[6] tapd0828ef0&#45;eb</text>
<polygon fill="#909090" stroke="none" points="861,-489 861,-512 956,-512 956,-489 861,-489"/>
<polygon fill="none" stroke="black" points="861,-489 861,-512 956,-512 956,-489 861,-489"/>
<text text-anchor="start" x="882.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#909090" stroke="none" points="961,-489 961,-512 1055,-512 1055,-489 961,-489"/>
<polygon fill="none" stroke="black" points="961,-489 961,-512 1055,-512 1055,-489 961,-489"/>
<text text-anchor="start" x="982" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#909090" stroke="none" points="1060,-489 1060,-512 1154,-512 1154,-489 1060,-489"/>
<polygon fill="none" stroke="black" points="1060,-489 1060,-512 1154,-512 1154,-489 1060,-489"/>
<text text-anchor="start" x="1081" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#909090" stroke="none" points="1159,-489 1159,-512 1253,-512 1253,-489 1159,-489"/>
<polygon fill="none" stroke="black" points="1159,-489 1159,-512 1253,-512 1253,-489 1159,-489"/>
<text text-anchor="start" x="1180" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#909090" stroke="none" points="1258,-489 1258,-512 1355,-512 1355,-489 1258,-489"/>
<polygon fill="none" stroke="black" points="1258,-489 1258,-512 1355,-512 1355,-489 1258,-489"/>
<text text-anchor="start" x="1280.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#909090" stroke="none" points="1360,-489 1360,-512 1454,-512 1454,-489 1360,-489"/>
<polygon fill="none" stroke="black" points="1360,-489 1360,-512 1454,-512 1454,-489 1360,-489"/>
<text text-anchor="start" x="1381" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:2</text>
<polygon fill="#909090" stroke="none" points="1459,-489 1459,-512 1558,-512 1558,-489 1459,-489"/>
<polygon fill="none" stroke="black" points="1459,-489 1459,-512 1558,-512 1558,-489 1459,-489"/>
<text text-anchor="start" x="1482.5" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#909090" stroke="none" points="1563,-489 1563,-512 1657,-512 1657,-489 1563,-489"/>
<polygon fill="none" stroke="black" points="1563,-489 1563,-512 1657,-512 1657,-489 1563,-489"/>
<text text-anchor="start" x="1584" y="-498" font-family="Helvetica,sans-Serif" font-size="10.00">VLAN tag:3</text>
<polygon fill="#909090" stroke="none" points="861,-461 861,-484 956,-484 956,-461 861,-461"/>
<polygon fill="none" stroke="black" points="861,-461 861,-484 956,-484 956,-461 861,-461"/>
<text text-anchor="start" x="884" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.1/24</text>
<polygon fill="#909090" stroke="none" points="961,-461 961,-484 1055,-484 1055,-461 961,-461"/>
<polygon fill="none" stroke="black" points="961,-461 961,-484 1055,-484 1055,-461 961,-461"/>
<text text-anchor="start" x="983.5" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.2/24</text>
<polygon fill="#909090" stroke="none" points="1060,-461 1060,-484 1154,-484 1154,-461 1060,-461"/>
<polygon fill="none" stroke="black" points="1060,-461 1060,-484 1154,-484 1154,-461 1060,-461"/>
<text text-anchor="start" x="1082.5" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.1/24</text>
<polygon fill="#909090" stroke="none" points="1159,-461 1159,-484 1253,-484 1253,-461 1159,-461"/>
<polygon fill="none" stroke="black" points="1159,-461 1159,-484 1253,-484 1253,-461 1159,-461"/>
<text text-anchor="start" x="1181.5" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.2/24</text>
<polygon fill="#909090" stroke="none" points="1258,-461 1258,-484 1355,-484 1355,-461 1258,-461"/>
<polygon fill="none" stroke="black" points="1258,-461 1258,-484 1355,-484 1355,-461 1258,-461"/>
<text text-anchor="start" x="1282" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.5/24</text>
<polygon fill="#909090" stroke="none" points="1360,-461 1360,-484 1454,-484 1454,-461 1360,-461"/>
<polygon fill="none" stroke="black" points="1360,-461 1360,-484 1454,-484 1454,-461 1360,-461"/>
<text text-anchor="start" x="1382.5" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.2.2/24</text>
<polygon fill="#909090" stroke="none" points="1459,-461 1459,-484 1558,-484 1558,-461 1459,-461"/>
<polygon fill="none" stroke="black" points="1459,-461 1459,-484 1558,-484 1558,-461 1459,-461"/>
<text text-anchor="start" x="1484" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.5/24</text>
<polygon fill="#909090" stroke="none" points="1563,-461 1563,-484 1657,-484 1657,-461 1563,-461"/>
<polygon fill="none" stroke="black" points="1563,-461 1563,-484 1657,-484 1657,-461 1563,-461"/>
<text text-anchor="start" x="1585.5" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00">10.0.3.2/24</text>
<polygon fill="#909090" stroke="none" points="861,-433 861,-456 1055,-456 1055,-433 861,-433"/>
<polygon fill="none" stroke="black" points="861,-433 861,-456 1055,-456 1055,-433 861,-433"/>
<text text-anchor="start" x="940.5" y="-442" font-family="Helvetica,sans-Serif" font-size="10.00">private2</text>
<polygon fill="#909090" stroke="none" points="1060,-433 1060,-456 1253,-456 1253,-433 1060,-433"/>
<polygon fill="none" stroke="black" points="1060,-433 1060,-456 1253,-456 1253,-433 1060,-433"/>
<text text-anchor="start" x="1139" y="-442" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#909090" stroke="none" points="1258,-433 1258,-456 1454,-456 1454,-433 1258,-433"/>
<polygon fill="none" stroke="black" points="1258,-433 1258,-456 1454,-456 1454,-433 1258,-433"/>
<text text-anchor="start" x="1338.5" y="-442" font-family="Helvetica,sans-Serif" font-size="10.00">private1</text>
<polygon fill="#909090" stroke="none" points="1459,-433 1459,-456 1657,-456 1657,-433 1459,-433"/>
<polygon fill="none" stroke="black" points="1459,-433 1459,-456 1657,-456 1657,-433 1459,-433"/>
<text text-anchor="start" x="1540.5" y="-442" font-family="Helvetica,sans-Serif" font-size="10.00">private2</text>
<polygon fill="#909090" stroke="none" points="861,-405 861,-428 1253,-428 1253,-405 861,-405"/>
<polygon fill="none" stroke="black" points="861,-405 861,-428 1253,-428 1253,-405 861,-405"/>
<text text-anchor="start" x="1041.5" y="-414" font-family="Helvetica,sans-Serif" font-size="10.00">router1</text>
<polygon fill="#909090" stroke="none" points="1258,-405 1258,-428 1657,-428 1657,-405 1258,-405"/>
<polygon fill="none" stroke="black" points="1258,-405 1258,-428 1657,-428 1657,-405 1258,-405"/>
<text text-anchor="start" x="1442" y="-414" font-family="Helvetica,sans-Serif" font-size="10.00">router2</text>
<polygon fill="#909090" stroke="none" points="861,-377 861,-400 1657,-400 1657,-377 861,-377"/>
<polygon fill="none" stroke="black" points="861,-377 861,-400 1657,-400 1657,-377 861,-377"/>
<text text-anchor="start" x="1231.5" y="-386" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;tun</text>
</g>
<!-- br_ex&#45;&gt;network_br_int -->
<g id="edge19" class="edge"><title>br_ex:qg_e2b1b0d3_a8:s&#45;&gt;network_br_int:qr_361be2af_e5:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M1257,-656C1257,-600.267 1307,-596.733 1307,-541"/>
</g>
<!-- br_ex&#45;&gt;network_br_int -->
<g id="edge20" class="edge"><title>br_ex:qg_e2b1b0d3_a8:s&#45;&gt;network_br_int:qr_b66b902a_36:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M1257,-656C1257,-532.889 1509,-664.111 1509,-541"/>
</g>
<!-- br_ex&#45;&gt;network_br_int -->
<g id="edge21" class="edge"><title>br_ex:qg_eb8796fb_83:s&#45;&gt;network_br_int:qr_09a15e37_ca:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M1156,-656C1156,-534.504 908,-662.496 908,-541"/>
</g>
<!-- br_ex&#45;&gt;network_br_int -->
<g id="edge22" class="edge"><title>br_ex:qg_eb8796fb_83:s&#45;&gt;network_br_int:qr_622abba5_e2:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M1156,-656C1156,-600.443 1107,-596.557 1107,-541"/>
</g>
<!-- network_br_tun -->
<g id="node9" class="node"><title>network_br_tun</title>
<polygon fill="white" stroke="none" points="1205.5,-204 1205.5,-264 1310.5,-264 1310.5,-204 1205.5,-204"/>
<polygon fill="white" stroke="none" points="1211,-237 1211,-259 1306,-259 1306,-237 1211,-237"/>
<text text-anchor="start" x="1232.5" y="-245.5" font-family="Helvetica,sans-Serif" font-size="10.00">OVS br_tun</text>
<polygon fill="#909090" stroke="none" points="1211,-209 1211,-232 1306,-232 1306,-209 1211,-209"/>
<polygon fill="none" stroke="black" points="1211,-209 1211,-232 1306,-232 1306,-209 1211,-209"/>
<text text-anchor="start" x="1232.5" y="-218" font-family="Helvetica,sans-Serif" font-size="10.00">[1] patch&#45;int</text>
</g>
<!-- network_br_int&#45;&gt;network_br_tun -->
<g id="edge18" class="edge"><title>network_br_int:patch_tun:s&#45;&gt;network_br_tun:patch_int:n</title>
<path fill="none" stroke="#909090" stroke-width="4" d="M1259,-376C1259,-312.444 1259,-296.556 1259,-233"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 40 KiB

View File

@ -2,7 +2,8 @@
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
hacking<0.11,>=0.10.0
#hacking<0.11,>=0.10.0
flake8<2.6.0,>=2.5.4
coverage>=3.6
python-subunit>=0.0.18

View File

@ -59,6 +59,6 @@ commands = oslo_debug_helper {posargs}
# E123, E125 skipped as they are invalid PEP-8.
show-source = True
ignore = E123,E125
ignore = E123,E125,H101,H302,H803,W601,E501
builtins = _
exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build
exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build,tools,local_settings.py