diff options
| author | Armando Migliaccio <armando.migliaccio@citrix.com> | 2010-11-25 10:46:58 +0000 |
|---|---|---|
| committer | Armando Migliaccio <armando.migliaccio@citrix.com> | 2010-11-25 10:46:58 +0000 |
| commit | 71c358e69c80cbeb349db94be20a4c8cf2222276 (patch) | |
| tree | d1b01edb17014af89ccbe9e7031824eb114fc417 | |
| parent | 9f722a0bcdb987c228f4ebf1e42c904a26d0ef73 (diff) | |
| parent | 07ee9639a105a58b8b212fff607f4e0639d411da (diff) | |
small conflict resolution
187 files changed, 2417 insertions, 48 deletions
diff --git a/.mailmap b/.mailmap new file mode 100644 index 000000000..2a6eb8d7d --- /dev/null +++ b/.mailmap @@ -0,0 +1,29 @@ +# Format is: +# <preferred e-mail> <other e-mail> +<code@term.ie> <github@anarkystic.com> +<code@term.ie> <termie@preciousroy.local> +<Armando.Migliaccio@eu.citrix.com> <armando.migliaccio@citrix.com> +<matt.dietz@rackspace.com> <matthewdietz@Matthew-Dietzs-MacBook-Pro.local> +<matt.dietz@rackspace.com> <mdietz@openstack> +<cbehrens@codestud.com> <chris.behrens@rackspace.com> +<devin.carlen@gmail.com> <devcamcar@illian.local> +<ewan.mellor@citrix.com> <emellor@silver> +<jaypipes@gmail.com> <jpipes@serialcoder> +<anotherjesse@gmail.com> <jesse@dancelamb> +<anotherjesse@gmail.com> <jesse@gigantor.local> +<anotherjesse@gmail.com> <jesse@ubuntu> +<jmckenty@gmail.com> <jmckenty@yyj-dhcp171.corp.flock.com> +<jmckenty@gmail.com> <jmckenty@joshua-mckentys-macbook-pro.local> +<jmckenty@gmail.com> <joshua.mckenty@nasa.gov> +<justin@fathomdb.com> <justinsb@justinsb-desktop> +<mordred@inaugust.com> <mordred@hudson> +<paul@openstack.org> <pvoccio@castor.local> +<paul@openstack.org> <paul.voccio@rackspace.com> +<todd@ansolabs.com> <todd@lapex> +<todd@ansolabs.com> <todd@rubidine.com> +<vishvananda@gmail.com> <vishvananda@yahoo.com> +<vishvananda@gmail.com> <root@mirror.nasanebula.net> +# These are from people who failed to set a proper committer +. <root@tonbuntu> +. <laner@controller> +. <root@ubuntu> @@ -1,6 +1,9 @@ Andy Smith <code@term.ie> Anne Gentle <anne@openstack.org> +Anthony Young <sleepsonthefloor@gmail.com> +Armando Migliaccio <Armando.Migliaccio@eu.citrix.com> Chris Behrens <cbehrens@codestud.com> +Dean Troyer <dtroyer@gmail.com> Devin Carlen <devin.carlen@gmail.com> Eric Day <eday@oddments.org> Ewan Mellor <ewan.mellor@citrix.com> @@ -8,7 +11,8 @@ Hisaki Ohara <hisaki.ohara@intel.com> Jay Pipes <jaypipes@gmail.com> Jesse Andrews <anotherjesse@gmail.com> Joe Heck <heckj@mac.com> -Joel Moore joelbm24@gmail.com +Joel Moore <joelbm24@gmail.com> +Josh Kearney <josh.kearney@rackspace.com> Joshua McKenty <jmckenty@gmail.com> Justin Santa Barbara <justin@fathomdb.com> Matt Dietz <matt.dietz@rackspace.com> @@ -19,3 +23,5 @@ Rick Clark <rick@openstack.org> Soren Hansen <soren.hansen@rackspace.com> Todd Willey <todd@ansolabs.com> Vishvananda Ishaya <vishvananda@gmail.com> +Youcef Laribi <Youcef.Laribi@eu.citrix.com> +Zhixue Wu <Zhixue.Wu@citrix.com> diff --git a/MANIFEST.in b/MANIFEST.in index 4fe5f0b34..982b727aa 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -13,9 +13,7 @@ include nova/cloudpipe/client.ovpn.template include nova/compute/fakevirtinstance.xml include nova/compute/interfaces.template include nova/virt/interfaces.template -include nova/virt/libvirt.qemu.xml.template -include nova/virt/libvirt.uml.xml.template -include nova/virt/libvirt.xen.xml.template +include nova/virt/libvirt.*.xml.template include nova/tests/CA/ include nova/tests/CA/cacert.pem include nova/tests/CA/private/ diff --git a/bin/nova-api b/bin/nova-api index a9002ae2d..a9c53dbcd 100755 --- a/bin/nova-api +++ b/bin/nova-api @@ -38,15 +38,17 @@ from nova import server FLAGS = flags.FLAGS flags.DEFINE_integer('osapi_port', 8774, 'OpenStack API port') +flags.DEFINE_string('osapi_host', '0.0.0.0', 'OpenStack API host') flags.DEFINE_integer('ec2api_port', 8773, 'EC2 API port') +flags.DEFINE_string('ec2api_host', '0.0.0.0', 'EC2 API host') def main(_args): from nova import api from nova import wsgi server = wsgi.Server() - server.start(api.API('os'), FLAGS.osapi_port) - server.start(api.API('ec2'), FLAGS.ec2api_port) + server.start(api.API('os'), FLAGS.osapi_port, host=FLAGS.osapi_host) + server.start(api.API('ec2'), FLAGS.ec2api_port, host=FLAGS.ec2api_host) server.wait() diff --git a/bin/nova-compute b/bin/nova-compute index 1724e9659..a66477af5 100755 --- a/bin/nova-compute +++ b/bin/nova-compute @@ -34,10 +34,12 @@ if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')): from nova import service from nova import twistd +from nova import utils if __name__ == '__main__': twistd.serve(__file__) if __name__ == '__builtin__': + utils.default_flagfile() application = service.Service.create() # pylint: disable=C0103 diff --git a/bin/nova-instancemonitor b/bin/nova-instancemonitor index 094da4033..a7b7fb0c6 100755 --- a/bin/nova-instancemonitor +++ b/bin/nova-instancemonitor @@ -34,6 +34,7 @@ possible_topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]), if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')): sys.path.insert(0, possible_topdir) +from nova import utils from nova import twistd from nova.compute import monitor @@ -44,6 +45,7 @@ if __name__ == '__main__': twistd.serve(__file__) if __name__ == '__builtin__': + utils.default_flagfile() logging.warn('Starting instance monitor') # pylint: disable-msg=C0103 monitor = monitor.InstanceMonitor() diff --git a/bin/nova-manage b/bin/nova-manage index 08b3da123..eb7c6b87b 100755 --- a/bin/nova-manage +++ b/bin/nova-manage @@ -467,7 +467,7 @@ def methods_of(obj): def main(): """Parse options and call the appropriate class/method.""" - utils.default_flagfile('/etc/nova/nova-manage.conf') + utils.default_flagfile() argv = FLAGS(sys.argv) if FLAGS.verbose: diff --git a/bin/nova-network b/bin/nova-network index fa88aeb47..342a63058 100755 --- a/bin/nova-network +++ b/bin/nova-network @@ -34,10 +34,12 @@ if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')): from nova import service from nova import twistd +from nova import utils if __name__ == '__main__': twistd.serve(__file__) if __name__ == '__builtin__': + utils.default_flagfile() application = service.Service.create() # pylint: disable-msg=C0103 diff --git a/bin/nova-scheduler b/bin/nova-scheduler index 38a8f213f..069b5a6fa 100755 --- a/bin/nova-scheduler +++ b/bin/nova-scheduler @@ -34,10 +34,12 @@ if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')): from nova import service from nova import twistd +from nova import utils if __name__ == '__main__': twistd.serve(__file__) if __name__ == '__builtin__': + utils.default_flagfile() application = service.Service.create() diff --git a/bin/nova-volume b/bin/nova-volume index b9e235717..26148b0ec 100755 --- a/bin/nova-volume +++ b/bin/nova-volume @@ -34,10 +34,12 @@ if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')): from nova import service from nova import twistd +from nova import utils if __name__ == '__main__': twistd.serve(__file__) if __name__ == '__builtin__': + utils.default_flagfile() application = service.Service.create() # pylint: disable-msg=C0103 diff --git a/contrib/nova.sh b/contrib/nova.sh index 9bc36d6fb..f47d972ab 100755 --- a/contrib/nova.sh +++ b/contrib/nova.sh @@ -40,7 +40,6 @@ cat >/etc/nova/nova-manage.conf << NOVA_CONF_EOF --verbose --nodaemon --dhcpbridge_flagfile=/etc/nova/nova-manage.conf ---FAKE_subdomain=ec2 --cc_host=$HOST_IP --routing_source_ip=$HOST_IP --sql_connection=$SQL_CONN diff --git a/contrib/puppet/templates/production/nova-common.conf.erb b/contrib/puppet/templates/production/nova-common.conf.erb index 00c110781..23ee0c5e8 100644 --- a/contrib/puppet/templates/production/nova-common.conf.erb +++ b/contrib/puppet/templates/production/nova-common.conf.erb @@ -46,7 +46,6 @@ --quota_gigabytes=100 --use_nova_chains=True --input_chain=services ---FAKE_subdomain=ec2 --use_project_ca=True --fixed_ip_disassociate_timeout=300 --api_max_requests=1 diff --git a/doc/build/doctrees/adminguide/binaries.doctree b/doc/build/doctrees/adminguide/binaries.doctree Binary files differdeleted file mode 100644 index 8006245a9..000000000 --- a/doc/build/doctrees/adminguide/binaries.doctree +++ /dev/null diff --git a/doc/build/doctrees/adminguide/distros/others.doctree b/doc/build/doctrees/adminguide/distros/others.doctree Binary files differdeleted file mode 100644 index c7f14fb91..000000000 --- a/doc/build/doctrees/adminguide/distros/others.doctree +++ /dev/null diff --git a/doc/build/doctrees/adminguide/distros/ubuntu.10.04.doctree b/doc/build/doctrees/adminguide/distros/ubuntu.10.04.doctree Binary files differdeleted file mode 100644 index 135763bf7..000000000 --- a/doc/build/doctrees/adminguide/distros/ubuntu.10.04.doctree +++ /dev/null diff --git a/doc/build/doctrees/adminguide/distros/ubuntu.10.10.doctree b/doc/build/doctrees/adminguide/distros/ubuntu.10.10.doctree Binary files differdeleted file mode 100644 index 2005aa78c..000000000 --- a/doc/build/doctrees/adminguide/distros/ubuntu.10.10.doctree +++ /dev/null diff --git a/doc/build/doctrees/adminguide/euca2ools.doctree b/doc/build/doctrees/adminguide/euca2ools.doctree Binary files differdeleted file mode 100644 index 390845265..000000000 --- a/doc/build/doctrees/adminguide/euca2ools.doctree +++ /dev/null diff --git a/doc/build/doctrees/adminguide/flags.doctree b/doc/build/doctrees/adminguide/flags.doctree Binary files differdeleted file mode 100644 index 0fd0522b8..000000000 --- a/doc/build/doctrees/adminguide/flags.doctree +++ /dev/null diff --git a/doc/build/doctrees/adminguide/getting.started.doctree b/doc/build/doctrees/adminguide/getting.started.doctree Binary files differdeleted file mode 100644 index a4d1fce7a..000000000 --- a/doc/build/doctrees/adminguide/getting.started.doctree +++ /dev/null diff --git a/doc/build/doctrees/adminguide/index.doctree b/doc/build/doctrees/adminguide/index.doctree Binary files differdeleted file mode 100644 index 43791ff9d..000000000 --- a/doc/build/doctrees/adminguide/index.doctree +++ /dev/null diff --git a/doc/build/doctrees/adminguide/managing.images.doctree b/doc/build/doctrees/adminguide/managing.images.doctree Binary files differdeleted file mode 100644 index 764bc8ace..000000000 --- a/doc/build/doctrees/adminguide/managing.images.doctree +++ /dev/null diff --git a/doc/build/doctrees/adminguide/managing.instances.doctree b/doc/build/doctrees/adminguide/managing.instances.doctree Binary files differdeleted file mode 100644 index 3bd9917de..000000000 --- a/doc/build/doctrees/adminguide/managing.instances.doctree +++ /dev/null diff --git a/doc/build/doctrees/adminguide/managing.networks.doctree b/doc/build/doctrees/adminguide/managing.networks.doctree Binary files differdeleted file mode 100644 index e34f6ae28..000000000 --- a/doc/build/doctrees/adminguide/managing.networks.doctree +++ /dev/null diff --git a/doc/build/doctrees/adminguide/managing.projects.doctree b/doc/build/doctrees/adminguide/managing.projects.doctree Binary files differdeleted file mode 100644 index 041c1dd61..000000000 --- a/doc/build/doctrees/adminguide/managing.projects.doctree +++ /dev/null diff --git a/doc/build/doctrees/adminguide/managing.users.doctree b/doc/build/doctrees/adminguide/managing.users.doctree Binary files differdeleted file mode 100644 index c21f05487..000000000 --- a/doc/build/doctrees/adminguide/managing.users.doctree +++ /dev/null diff --git a/doc/build/doctrees/adminguide/managingsecurity.doctree b/doc/build/doctrees/adminguide/managingsecurity.doctree Binary files differdeleted file mode 100644 index 8d5a35097..000000000 --- a/doc/build/doctrees/adminguide/managingsecurity.doctree +++ /dev/null diff --git a/doc/build/doctrees/adminguide/monitoring.doctree b/doc/build/doctrees/adminguide/monitoring.doctree Binary files differdeleted file mode 100644 index c0c83f29a..000000000 --- a/doc/build/doctrees/adminguide/monitoring.doctree +++ /dev/null diff --git a/doc/build/doctrees/adminguide/multi.node.install.doctree b/doc/build/doctrees/adminguide/multi.node.install.doctree Binary files differdeleted file mode 100644 index 0b24939e6..000000000 --- a/doc/build/doctrees/adminguide/multi.node.install.doctree +++ /dev/null diff --git a/doc/build/doctrees/adminguide/network.flat.doctree b/doc/build/doctrees/adminguide/network.flat.doctree Binary files differdeleted file mode 100644 index 99b60132e..000000000 --- a/doc/build/doctrees/adminguide/network.flat.doctree +++ /dev/null diff --git a/doc/build/doctrees/adminguide/network.vlan.doctree b/doc/build/doctrees/adminguide/network.vlan.doctree Binary files differdeleted file mode 100644 index 02e6e7ef1..000000000 --- a/doc/build/doctrees/adminguide/network.vlan.doctree +++ /dev/null diff --git a/doc/build/doctrees/adminguide/nova.manage.doctree b/doc/build/doctrees/adminguide/nova.manage.doctree Binary files differdeleted file mode 100644 index b06b1fc48..000000000 --- a/doc/build/doctrees/adminguide/nova.manage.doctree +++ /dev/null diff --git a/doc/build/doctrees/adminguide/single.node.install.doctree b/doc/build/doctrees/adminguide/single.node.install.doctree Binary files differdeleted file mode 100644 index a0a0c9271..000000000 --- a/doc/build/doctrees/adminguide/single.node.install.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/autoindex.doctree b/doc/build/doctrees/api/autoindex.doctree Binary files differdeleted file mode 100644 index ca690eeab..000000000 --- a/doc/build/doctrees/api/autoindex.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..adminclient.doctree b/doc/build/doctrees/api/nova..adminclient.doctree Binary files differdeleted file mode 100644 index 5fc153196..000000000 --- a/doc/build/doctrees/api/nova..adminclient.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..api.cloud.doctree b/doc/build/doctrees/api/nova..api.cloud.doctree Binary files differdeleted file mode 100644 index 21d8011be..000000000 --- a/doc/build/doctrees/api/nova..api.cloud.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..api.ec2.admin.doctree b/doc/build/doctrees/api/nova..api.ec2.admin.doctree Binary files differdeleted file mode 100644 index 3fec631a4..000000000 --- a/doc/build/doctrees/api/nova..api.ec2.admin.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..api.ec2.apirequest.doctree b/doc/build/doctrees/api/nova..api.ec2.apirequest.doctree Binary files differdeleted file mode 100644 index b212d15a7..000000000 --- a/doc/build/doctrees/api/nova..api.ec2.apirequest.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..api.ec2.cloud.doctree b/doc/build/doctrees/api/nova..api.ec2.cloud.doctree Binary files differdeleted file mode 100644 index 16d7ad90a..000000000 --- a/doc/build/doctrees/api/nova..api.ec2.cloud.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..api.ec2.images.doctree b/doc/build/doctrees/api/nova..api.ec2.images.doctree Binary files differdeleted file mode 100644 index 340a4bc04..000000000 --- a/doc/build/doctrees/api/nova..api.ec2.images.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..api.ec2.metadatarequesthandler.doctree b/doc/build/doctrees/api/nova..api.ec2.metadatarequesthandler.doctree Binary files differdeleted file mode 100644 index c1da3eaf9..000000000 --- a/doc/build/doctrees/api/nova..api.ec2.metadatarequesthandler.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..api.openstack.auth.doctree b/doc/build/doctrees/api/nova..api.openstack.auth.doctree Binary files differdeleted file mode 100644 index b5e4e32ae..000000000 --- a/doc/build/doctrees/api/nova..api.openstack.auth.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..api.openstack.backup_schedules.doctree b/doc/build/doctrees/api/nova..api.openstack.backup_schedules.doctree Binary files differdeleted file mode 100644 index 3e063ce80..000000000 --- a/doc/build/doctrees/api/nova..api.openstack.backup_schedules.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..api.openstack.faults.doctree b/doc/build/doctrees/api/nova..api.openstack.faults.doctree Binary files differdeleted file mode 100644 index e2c149b4b..000000000 --- a/doc/build/doctrees/api/nova..api.openstack.faults.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..api.openstack.flavors.doctree b/doc/build/doctrees/api/nova..api.openstack.flavors.doctree Binary files differdeleted file mode 100644 index 0df3200c1..000000000 --- a/doc/build/doctrees/api/nova..api.openstack.flavors.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..api.openstack.images.doctree b/doc/build/doctrees/api/nova..api.openstack.images.doctree Binary files differdeleted file mode 100644 index e2f83944b..000000000 --- a/doc/build/doctrees/api/nova..api.openstack.images.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..api.openstack.servers.doctree b/doc/build/doctrees/api/nova..api.openstack.servers.doctree Binary files differdeleted file mode 100644 index 64bf16c45..000000000 --- a/doc/build/doctrees/api/nova..api.openstack.servers.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..api.openstack.sharedipgroups.doctree b/doc/build/doctrees/api/nova..api.openstack.sharedipgroups.doctree Binary files differdeleted file mode 100644 index 144e9472b..000000000 --- a/doc/build/doctrees/api/nova..api.openstack.sharedipgroups.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..auth.dbdriver.doctree b/doc/build/doctrees/api/nova..auth.dbdriver.doctree Binary files differdeleted file mode 100644 index 6fdcc725e..000000000 --- a/doc/build/doctrees/api/nova..auth.dbdriver.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..auth.fakeldap.doctree b/doc/build/doctrees/api/nova..auth.fakeldap.doctree Binary files differdeleted file mode 100644 index 2723a22ff..000000000 --- a/doc/build/doctrees/api/nova..auth.fakeldap.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..auth.ldapdriver.doctree b/doc/build/doctrees/api/nova..auth.ldapdriver.doctree Binary files differdeleted file mode 100644 index 1698a7a67..000000000 --- a/doc/build/doctrees/api/nova..auth.ldapdriver.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..auth.manager.doctree b/doc/build/doctrees/api/nova..auth.manager.doctree Binary files differdeleted file mode 100644 index e323006e1..000000000 --- a/doc/build/doctrees/api/nova..auth.manager.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..auth.signer.doctree b/doc/build/doctrees/api/nova..auth.signer.doctree Binary files differdeleted file mode 100644 index fe4dd3f67..000000000 --- a/doc/build/doctrees/api/nova..auth.signer.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..cloudpipe.pipelib.doctree b/doc/build/doctrees/api/nova..cloudpipe.pipelib.doctree Binary files differdeleted file mode 100644 index 5027c13bb..000000000 --- a/doc/build/doctrees/api/nova..cloudpipe.pipelib.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..compute.disk.doctree b/doc/build/doctrees/api/nova..compute.disk.doctree Binary files differdeleted file mode 100644 index ac3a5478e..000000000 --- a/doc/build/doctrees/api/nova..compute.disk.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..compute.instance_types.doctree b/doc/build/doctrees/api/nova..compute.instance_types.doctree Binary files differdeleted file mode 100644 index 2a7c03553..000000000 --- a/doc/build/doctrees/api/nova..compute.instance_types.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..compute.manager.doctree b/doc/build/doctrees/api/nova..compute.manager.doctree Binary files differdeleted file mode 100644 index bc7446484..000000000 --- a/doc/build/doctrees/api/nova..compute.manager.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..compute.monitor.doctree b/doc/build/doctrees/api/nova..compute.monitor.doctree Binary files differdeleted file mode 100644 index 34cad0354..000000000 --- a/doc/build/doctrees/api/nova..compute.monitor.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..compute.power_state.doctree b/doc/build/doctrees/api/nova..compute.power_state.doctree Binary files differdeleted file mode 100644 index b2424de7b..000000000 --- a/doc/build/doctrees/api/nova..compute.power_state.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..context.doctree b/doc/build/doctrees/api/nova..context.doctree Binary files differdeleted file mode 100644 index b8352dfd5..000000000 --- a/doc/build/doctrees/api/nova..context.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..crypto.doctree b/doc/build/doctrees/api/nova..crypto.doctree Binary files differdeleted file mode 100644 index e40b776f1..000000000 --- a/doc/build/doctrees/api/nova..crypto.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..db.api.doctree b/doc/build/doctrees/api/nova..db.api.doctree Binary files differdeleted file mode 100644 index e8ffeed71..000000000 --- a/doc/build/doctrees/api/nova..db.api.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..db.sqlalchemy.api.doctree b/doc/build/doctrees/api/nova..db.sqlalchemy.api.doctree Binary files differdeleted file mode 100644 index a67a57d41..000000000 --- a/doc/build/doctrees/api/nova..db.sqlalchemy.api.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..db.sqlalchemy.models.doctree b/doc/build/doctrees/api/nova..db.sqlalchemy.models.doctree Binary files differdeleted file mode 100644 index 42a1e51fe..000000000 --- a/doc/build/doctrees/api/nova..db.sqlalchemy.models.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..db.sqlalchemy.session.doctree b/doc/build/doctrees/api/nova..db.sqlalchemy.session.doctree Binary files differdeleted file mode 100644 index 1253924b5..000000000 --- a/doc/build/doctrees/api/nova..db.sqlalchemy.session.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..exception.doctree b/doc/build/doctrees/api/nova..exception.doctree Binary files differdeleted file mode 100644 index 53f4b6889..000000000 --- a/doc/build/doctrees/api/nova..exception.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..fakerabbit.doctree b/doc/build/doctrees/api/nova..fakerabbit.doctree Binary files differdeleted file mode 100644 index b63c50cd8..000000000 --- a/doc/build/doctrees/api/nova..fakerabbit.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..flags.doctree b/doc/build/doctrees/api/nova..flags.doctree Binary files differdeleted file mode 100644 index ca1115625..000000000 --- a/doc/build/doctrees/api/nova..flags.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..image.service.doctree b/doc/build/doctrees/api/nova..image.service.doctree Binary files differdeleted file mode 100644 index 9798631ae..000000000 --- a/doc/build/doctrees/api/nova..image.service.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..manager.doctree b/doc/build/doctrees/api/nova..manager.doctree Binary files differdeleted file mode 100644 index 59c20c56c..000000000 --- a/doc/build/doctrees/api/nova..manager.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..network.linux_net.doctree b/doc/build/doctrees/api/nova..network.linux_net.doctree Binary files differdeleted file mode 100644 index 850b1fe46..000000000 --- a/doc/build/doctrees/api/nova..network.linux_net.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..network.manager.doctree b/doc/build/doctrees/api/nova..network.manager.doctree Binary files differdeleted file mode 100644 index 5a17fa2a6..000000000 --- a/doc/build/doctrees/api/nova..network.manager.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..objectstore.bucket.doctree b/doc/build/doctrees/api/nova..objectstore.bucket.doctree Binary files differdeleted file mode 100644 index c4c5cfa86..000000000 --- a/doc/build/doctrees/api/nova..objectstore.bucket.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..objectstore.handler.doctree b/doc/build/doctrees/api/nova..objectstore.handler.doctree Binary files differdeleted file mode 100644 index dd22550ad..000000000 --- a/doc/build/doctrees/api/nova..objectstore.handler.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..objectstore.image.doctree b/doc/build/doctrees/api/nova..objectstore.image.doctree Binary files differdeleted file mode 100644 index 89e80c8b7..000000000 --- a/doc/build/doctrees/api/nova..objectstore.image.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..objectstore.stored.doctree b/doc/build/doctrees/api/nova..objectstore.stored.doctree Binary files differdeleted file mode 100644 index 37eb82db0..000000000 --- a/doc/build/doctrees/api/nova..objectstore.stored.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..process.doctree b/doc/build/doctrees/api/nova..process.doctree Binary files differdeleted file mode 100644 index ca306d07e..000000000 --- a/doc/build/doctrees/api/nova..process.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..quota.doctree b/doc/build/doctrees/api/nova..quota.doctree Binary files differdeleted file mode 100644 index ea7e87026..000000000 --- a/doc/build/doctrees/api/nova..quota.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..rpc.doctree b/doc/build/doctrees/api/nova..rpc.doctree Binary files differdeleted file mode 100644 index d774f13ac..000000000 --- a/doc/build/doctrees/api/nova..rpc.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..scheduler.chance.doctree b/doc/build/doctrees/api/nova..scheduler.chance.doctree Binary files differdeleted file mode 100644 index 0d65dbd82..000000000 --- a/doc/build/doctrees/api/nova..scheduler.chance.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..scheduler.driver.doctree b/doc/build/doctrees/api/nova..scheduler.driver.doctree Binary files differdeleted file mode 100644 index cdd709e09..000000000 --- a/doc/build/doctrees/api/nova..scheduler.driver.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..scheduler.manager.doctree b/doc/build/doctrees/api/nova..scheduler.manager.doctree Binary files differdeleted file mode 100644 index 04d6d7a02..000000000 --- a/doc/build/doctrees/api/nova..scheduler.manager.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..scheduler.simple.doctree b/doc/build/doctrees/api/nova..scheduler.simple.doctree Binary files differdeleted file mode 100644 index 0831a51dc..000000000 --- a/doc/build/doctrees/api/nova..scheduler.simple.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..server.doctree b/doc/build/doctrees/api/nova..server.doctree Binary files differdeleted file mode 100644 index 3afb0e8ec..000000000 --- a/doc/build/doctrees/api/nova..server.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..service.doctree b/doc/build/doctrees/api/nova..service.doctree Binary files differdeleted file mode 100644 index 7f7ae945f..000000000 --- a/doc/build/doctrees/api/nova..service.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..test.doctree b/doc/build/doctrees/api/nova..test.doctree Binary files differdeleted file mode 100644 index 4c387d9a6..000000000 --- a/doc/build/doctrees/api/nova..test.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.access_unittest.doctree b/doc/build/doctrees/api/nova..tests.access_unittest.doctree Binary files differdeleted file mode 100644 index 62425af2b..000000000 --- a/doc/build/doctrees/api/nova..tests.access_unittest.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.api.fakes.doctree b/doc/build/doctrees/api/nova..tests.api.fakes.doctree Binary files differdeleted file mode 100644 index dda086c3e..000000000 --- a/doc/build/doctrees/api/nova..tests.api.fakes.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.api.openstack.fakes.doctree b/doc/build/doctrees/api/nova..tests.api.openstack.fakes.doctree Binary files differdeleted file mode 100644 index 326af55b7..000000000 --- a/doc/build/doctrees/api/nova..tests.api.openstack.fakes.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.api.openstack.test_api.doctree b/doc/build/doctrees/api/nova..tests.api.openstack.test_api.doctree Binary files differdeleted file mode 100644 index 16f344192..000000000 --- a/doc/build/doctrees/api/nova..tests.api.openstack.test_api.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.api.openstack.test_auth.doctree b/doc/build/doctrees/api/nova..tests.api.openstack.test_auth.doctree Binary files differdeleted file mode 100644 index 7fccdda3d..000000000 --- a/doc/build/doctrees/api/nova..tests.api.openstack.test_auth.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.api.openstack.test_faults.doctree b/doc/build/doctrees/api/nova..tests.api.openstack.test_faults.doctree Binary files differdeleted file mode 100644 index 6b82c60b2..000000000 --- a/doc/build/doctrees/api/nova..tests.api.openstack.test_faults.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.api.openstack.test_flavors.doctree b/doc/build/doctrees/api/nova..tests.api.openstack.test_flavors.doctree Binary files differdeleted file mode 100644 index 7339f03fc..000000000 --- a/doc/build/doctrees/api/nova..tests.api.openstack.test_flavors.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.api.openstack.test_images.doctree b/doc/build/doctrees/api/nova..tests.api.openstack.test_images.doctree Binary files differdeleted file mode 100644 index 30849418b..000000000 --- a/doc/build/doctrees/api/nova..tests.api.openstack.test_images.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.api.openstack.test_ratelimiting.doctree b/doc/build/doctrees/api/nova..tests.api.openstack.test_ratelimiting.doctree Binary files differdeleted file mode 100644 index ba40cd2f0..000000000 --- a/doc/build/doctrees/api/nova..tests.api.openstack.test_ratelimiting.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.api.openstack.test_servers.doctree b/doc/build/doctrees/api/nova..tests.api.openstack.test_servers.doctree Binary files differdeleted file mode 100644 index 37017584f..000000000 --- a/doc/build/doctrees/api/nova..tests.api.openstack.test_servers.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.api.openstack.test_sharedipgroups.doctree b/doc/build/doctrees/api/nova..tests.api.openstack.test_sharedipgroups.doctree Binary files differdeleted file mode 100644 index 6febac045..000000000 --- a/doc/build/doctrees/api/nova..tests.api.openstack.test_sharedipgroups.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.api.test_wsgi.doctree b/doc/build/doctrees/api/nova..tests.api.test_wsgi.doctree Binary files differdeleted file mode 100644 index f4fc78f11..000000000 --- a/doc/build/doctrees/api/nova..tests.api.test_wsgi.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.api_integration.doctree b/doc/build/doctrees/api/nova..tests.api_integration.doctree Binary files differdeleted file mode 100644 index 1a85b2439..000000000 --- a/doc/build/doctrees/api/nova..tests.api_integration.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.api_unittest.doctree b/doc/build/doctrees/api/nova..tests.api_unittest.doctree Binary files differdeleted file mode 100644 index de15e69c2..000000000 --- a/doc/build/doctrees/api/nova..tests.api_unittest.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.auth_unittest.doctree b/doc/build/doctrees/api/nova..tests.auth_unittest.doctree Binary files differdeleted file mode 100644 index 262beefbc..000000000 --- a/doc/build/doctrees/api/nova..tests.auth_unittest.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.cloud_unittest.doctree b/doc/build/doctrees/api/nova..tests.cloud_unittest.doctree Binary files differdeleted file mode 100644 index 69bbe7456..000000000 --- a/doc/build/doctrees/api/nova..tests.cloud_unittest.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.compute_unittest.doctree b/doc/build/doctrees/api/nova..tests.compute_unittest.doctree Binary files differdeleted file mode 100644 index 71874bbe8..000000000 --- a/doc/build/doctrees/api/nova..tests.compute_unittest.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.declare_flags.doctree b/doc/build/doctrees/api/nova..tests.declare_flags.doctree Binary files differdeleted file mode 100644 index 33d1e29d8..000000000 --- a/doc/build/doctrees/api/nova..tests.declare_flags.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.fake_flags.doctree b/doc/build/doctrees/api/nova..tests.fake_flags.doctree Binary files differdeleted file mode 100644 index cc925c70e..000000000 --- a/doc/build/doctrees/api/nova..tests.fake_flags.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.flags_unittest.doctree b/doc/build/doctrees/api/nova..tests.flags_unittest.doctree Binary files differdeleted file mode 100644 index d53aa0854..000000000 --- a/doc/build/doctrees/api/nova..tests.flags_unittest.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.network_unittest.doctree b/doc/build/doctrees/api/nova..tests.network_unittest.doctree Binary files differdeleted file mode 100644 index 721e3eb5e..000000000 --- a/doc/build/doctrees/api/nova..tests.network_unittest.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.objectstore_unittest.doctree b/doc/build/doctrees/api/nova..tests.objectstore_unittest.doctree Binary files differdeleted file mode 100644 index a012c0699..000000000 --- a/doc/build/doctrees/api/nova..tests.objectstore_unittest.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.process_unittest.doctree b/doc/build/doctrees/api/nova..tests.process_unittest.doctree Binary files differdeleted file mode 100644 index 284e15b3d..000000000 --- a/doc/build/doctrees/api/nova..tests.process_unittest.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.quota_unittest.doctree b/doc/build/doctrees/api/nova..tests.quota_unittest.doctree Binary files differdeleted file mode 100644 index cd2dc5588..000000000 --- a/doc/build/doctrees/api/nova..tests.quota_unittest.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.real_flags.doctree b/doc/build/doctrees/api/nova..tests.real_flags.doctree Binary files differdeleted file mode 100644 index 9f338dfe8..000000000 --- a/doc/build/doctrees/api/nova..tests.real_flags.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.rpc_unittest.doctree b/doc/build/doctrees/api/nova..tests.rpc_unittest.doctree Binary files differdeleted file mode 100644 index 9499865f1..000000000 --- a/doc/build/doctrees/api/nova..tests.rpc_unittest.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.runtime_flags.doctree b/doc/build/doctrees/api/nova..tests.runtime_flags.doctree Binary files differdeleted file mode 100644 index a652947c3..000000000 --- a/doc/build/doctrees/api/nova..tests.runtime_flags.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.scheduler_unittest.doctree b/doc/build/doctrees/api/nova..tests.scheduler_unittest.doctree Binary files differdeleted file mode 100644 index 22ff4eaf5..000000000 --- a/doc/build/doctrees/api/nova..tests.scheduler_unittest.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.service_unittest.doctree b/doc/build/doctrees/api/nova..tests.service_unittest.doctree Binary files differdeleted file mode 100644 index c5a225518..000000000 --- a/doc/build/doctrees/api/nova..tests.service_unittest.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.twistd_unittest.doctree b/doc/build/doctrees/api/nova..tests.twistd_unittest.doctree Binary files differdeleted file mode 100644 index a52f8dcf3..000000000 --- a/doc/build/doctrees/api/nova..tests.twistd_unittest.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.validator_unittest.doctree b/doc/build/doctrees/api/nova..tests.validator_unittest.doctree Binary files differdeleted file mode 100644 index d81dde843..000000000 --- a/doc/build/doctrees/api/nova..tests.validator_unittest.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.virt_unittest.doctree b/doc/build/doctrees/api/nova..tests.virt_unittest.doctree Binary files differdeleted file mode 100644 index 62b642b63..000000000 --- a/doc/build/doctrees/api/nova..tests.virt_unittest.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..tests.volume_unittest.doctree b/doc/build/doctrees/api/nova..tests.volume_unittest.doctree Binary files differdeleted file mode 100644 index c99f33eb8..000000000 --- a/doc/build/doctrees/api/nova..tests.volume_unittest.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..twistd.doctree b/doc/build/doctrees/api/nova..twistd.doctree Binary files differdeleted file mode 100644 index 893f4864b..000000000 --- a/doc/build/doctrees/api/nova..twistd.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..utils.doctree b/doc/build/doctrees/api/nova..utils.doctree Binary files differdeleted file mode 100644 index 4c164066c..000000000 --- a/doc/build/doctrees/api/nova..utils.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..validate.doctree b/doc/build/doctrees/api/nova..validate.doctree Binary files differdeleted file mode 100644 index 3098bc6fd..000000000 --- a/doc/build/doctrees/api/nova..validate.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..virt.connection.doctree b/doc/build/doctrees/api/nova..virt.connection.doctree Binary files differdeleted file mode 100644 index ea4dbaba1..000000000 --- a/doc/build/doctrees/api/nova..virt.connection.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..virt.fake.doctree b/doc/build/doctrees/api/nova..virt.fake.doctree Binary files differdeleted file mode 100644 index a028d10ec..000000000 --- a/doc/build/doctrees/api/nova..virt.fake.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..virt.images.doctree b/doc/build/doctrees/api/nova..virt.images.doctree Binary files differdeleted file mode 100644 index db2353d42..000000000 --- a/doc/build/doctrees/api/nova..virt.images.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..virt.libvirt_conn.doctree b/doc/build/doctrees/api/nova..virt.libvirt_conn.doctree Binary files differdeleted file mode 100644 index 3ae5410cb..000000000 --- a/doc/build/doctrees/api/nova..virt.libvirt_conn.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..virt.xenapi.doctree b/doc/build/doctrees/api/nova..virt.xenapi.doctree Binary files differdeleted file mode 100644 index 5173a3338..000000000 --- a/doc/build/doctrees/api/nova..virt.xenapi.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..volume.driver.doctree b/doc/build/doctrees/api/nova..volume.driver.doctree Binary files differdeleted file mode 100644 index a31cf96c0..000000000 --- a/doc/build/doctrees/api/nova..volume.driver.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..volume.manager.doctree b/doc/build/doctrees/api/nova..volume.manager.doctree Binary files differdeleted file mode 100644 index dceea1808..000000000 --- a/doc/build/doctrees/api/nova..volume.manager.doctree +++ /dev/null diff --git a/doc/build/doctrees/api/nova..wsgi.doctree b/doc/build/doctrees/api/nova..wsgi.doctree Binary files differdeleted file mode 100644 index 1b5467242..000000000 --- a/doc/build/doctrees/api/nova..wsgi.doctree +++ /dev/null diff --git a/doc/build/doctrees/cloud101.doctree b/doc/build/doctrees/cloud101.doctree Binary files differdeleted file mode 100644 index e7667f866..000000000 --- a/doc/build/doctrees/cloud101.doctree +++ /dev/null diff --git a/doc/build/doctrees/code.doctree b/doc/build/doctrees/code.doctree Binary files differdeleted file mode 100644 index ce5ad4485..000000000 --- a/doc/build/doctrees/code.doctree +++ /dev/null diff --git a/doc/build/doctrees/community.doctree b/doc/build/doctrees/community.doctree Binary files differdeleted file mode 100644 index 6837addb6..000000000 --- a/doc/build/doctrees/community.doctree +++ /dev/null diff --git a/doc/build/doctrees/devref/api.doctree b/doc/build/doctrees/devref/api.doctree Binary files differdeleted file mode 100644 index 8151a68da..000000000 --- a/doc/build/doctrees/devref/api.doctree +++ /dev/null diff --git a/doc/build/doctrees/devref/architecture.doctree b/doc/build/doctrees/devref/architecture.doctree Binary files differdeleted file mode 100644 index b5de0bc69..000000000 --- a/doc/build/doctrees/devref/architecture.doctree +++ /dev/null diff --git a/doc/build/doctrees/devref/auth.doctree b/doc/build/doctrees/devref/auth.doctree Binary files differdeleted file mode 100644 index 97d880a5e..000000000 --- a/doc/build/doctrees/devref/auth.doctree +++ /dev/null diff --git a/doc/build/doctrees/devref/cloudpipe.doctree b/doc/build/doctrees/devref/cloudpipe.doctree Binary files differdeleted file mode 100644 index d7f9a48a4..000000000 --- a/doc/build/doctrees/devref/cloudpipe.doctree +++ /dev/null diff --git a/doc/build/doctrees/devref/compute.doctree b/doc/build/doctrees/devref/compute.doctree Binary files differdeleted file mode 100644 index d74e49f5a..000000000 --- a/doc/build/doctrees/devref/compute.doctree +++ /dev/null diff --git a/doc/build/doctrees/devref/database.doctree b/doc/build/doctrees/devref/database.doctree Binary files differdeleted file mode 100644 index 7c57de72a..000000000 --- a/doc/build/doctrees/devref/database.doctree +++ /dev/null diff --git a/doc/build/doctrees/devref/development.environment.doctree b/doc/build/doctrees/devref/development.environment.doctree Binary files differdeleted file mode 100644 index 4862bd192..000000000 --- a/doc/build/doctrees/devref/development.environment.doctree +++ /dev/null diff --git a/doc/build/doctrees/devref/fakes.doctree b/doc/build/doctrees/devref/fakes.doctree Binary files differdeleted file mode 100644 index 8c07eced6..000000000 --- a/doc/build/doctrees/devref/fakes.doctree +++ /dev/null diff --git a/doc/build/doctrees/devref/glance.doctree b/doc/build/doctrees/devref/glance.doctree Binary files differdeleted file mode 100644 index 124d77771..000000000 --- a/doc/build/doctrees/devref/glance.doctree +++ /dev/null diff --git a/doc/build/doctrees/devref/index.doctree b/doc/build/doctrees/devref/index.doctree Binary files differdeleted file mode 100644 index 8c155355e..000000000 --- a/doc/build/doctrees/devref/index.doctree +++ /dev/null diff --git a/doc/build/doctrees/devref/modules.doctree b/doc/build/doctrees/devref/modules.doctree Binary files differdeleted file mode 100644 index e6dcde834..000000000 --- a/doc/build/doctrees/devref/modules.doctree +++ /dev/null diff --git a/doc/build/doctrees/devref/network.doctree b/doc/build/doctrees/devref/network.doctree Binary files differdeleted file mode 100644 index 57724103b..000000000 --- a/doc/build/doctrees/devref/network.doctree +++ /dev/null diff --git a/doc/build/doctrees/devref/nova.doctree b/doc/build/doctrees/devref/nova.doctree Binary files differdeleted file mode 100644 index 3e243c00b..000000000 --- a/doc/build/doctrees/devref/nova.doctree +++ /dev/null diff --git a/doc/build/doctrees/devref/objectstore.doctree b/doc/build/doctrees/devref/objectstore.doctree Binary files differdeleted file mode 100644 index 112c6856e..000000000 --- a/doc/build/doctrees/devref/objectstore.doctree +++ /dev/null diff --git a/doc/build/doctrees/devref/scheduler.doctree b/doc/build/doctrees/devref/scheduler.doctree Binary files differdeleted file mode 100644 index a82138866..000000000 --- a/doc/build/doctrees/devref/scheduler.doctree +++ /dev/null diff --git a/doc/build/doctrees/devref/services.doctree b/doc/build/doctrees/devref/services.doctree Binary files differdeleted file mode 100644 index b5bdb8f34..000000000 --- a/doc/build/doctrees/devref/services.doctree +++ /dev/null diff --git a/doc/build/doctrees/devref/volume.doctree b/doc/build/doctrees/devref/volume.doctree Binary files differdeleted file mode 100644 index 77ccc2f28..000000000 --- a/doc/build/doctrees/devref/volume.doctree +++ /dev/null diff --git a/doc/build/doctrees/environment.pickle b/doc/build/doctrees/environment.pickle Binary files differdeleted file mode 100644 index 6c3552ddc..000000000 --- a/doc/build/doctrees/environment.pickle +++ /dev/null diff --git a/doc/build/doctrees/index.doctree b/doc/build/doctrees/index.doctree Binary files differdeleted file mode 100644 index 0ce64eaea..000000000 --- a/doc/build/doctrees/index.doctree +++ /dev/null diff --git a/doc/build/doctrees/installer.doctree b/doc/build/doctrees/installer.doctree Binary files differdeleted file mode 100644 index b193cbe32..000000000 --- a/doc/build/doctrees/installer.doctree +++ /dev/null diff --git a/doc/build/doctrees/livecd.doctree b/doc/build/doctrees/livecd.doctree Binary files differdeleted file mode 100644 index 7e9ae7f3e..000000000 --- a/doc/build/doctrees/livecd.doctree +++ /dev/null diff --git a/doc/build/doctrees/man/novamanage.doctree b/doc/build/doctrees/man/novamanage.doctree Binary files differdeleted file mode 100644 index cccfa3e65..000000000 --- a/doc/build/doctrees/man/novamanage.doctree +++ /dev/null diff --git a/doc/build/doctrees/nova.concepts.doctree b/doc/build/doctrees/nova.concepts.doctree Binary files differdeleted file mode 100644 index 71fcc46bf..000000000 --- a/doc/build/doctrees/nova.concepts.doctree +++ /dev/null diff --git a/doc/build/doctrees/object.model.doctree b/doc/build/doctrees/object.model.doctree Binary files differdeleted file mode 100644 index 16500b8e9..000000000 --- a/doc/build/doctrees/object.model.doctree +++ /dev/null diff --git a/doc/build/doctrees/quickstart.doctree b/doc/build/doctrees/quickstart.doctree Binary files differdeleted file mode 100644 index fad66f8dd..000000000 --- a/doc/build/doctrees/quickstart.doctree +++ /dev/null diff --git a/doc/build/doctrees/service.architecture.doctree b/doc/build/doctrees/service.architecture.doctree Binary files differdeleted file mode 100644 index 4fc09dd05..000000000 --- a/doc/build/doctrees/service.architecture.doctree +++ /dev/null diff --git a/doc/source/adminguide/getting.started.rst b/doc/source/adminguide/getting.started.rst index 7075a0b02..3e8073606 100644 --- a/doc/source/adminguide/getting.started.rst +++ b/doc/source/adminguide/getting.started.rst @@ -140,7 +140,6 @@ A sample configuration to test the system follows:: --verbose --nodaemon - --FAKE_subdomain=ec2 --auth_driver=nova.auth.dbdriver.DbDriver Running diff --git a/doc/source/adminguide/multi.node.install.rst b/doc/source/adminguide/multi.node.install.rst index fa0652bc8..dcceb539b 100644 --- a/doc/source/adminguide/multi.node.install.rst +++ b/doc/source/adminguide/multi.node.install.rst @@ -92,7 +92,6 @@ Note: CC_ADDR=<the external IP address of your cloud controller> :: - --FAKE_subdomain=ec2 # workaround for ec2/euca api --fixed_range=<network/prefix> # ip network to use for VM guests, ex 192.168.2.64/26 --network_size=<# of addrs> # number of ip addrs to use for VM guests, ex 64 @@ -104,19 +103,13 @@ Note: CC_ADDR=<the external IP address of your cloud controller> --fixed_range=<network/prefix> # ip network to use for VM guests, ex 192.168.2.64/26 --network_size=<# of addrs> # number of ip addrs to use for VM guests, ex 64 -4. nova-api specific flags - -:: - - --FAKE_subdomain=ec2 # workaround for ec2/euca api - -5. Create a nova group +4. Create a nova group :: sudo addgroup nova -6. nova-objectstore specific flags < no specific config needed > +5. nova-objectstore specific flags < no specific config needed > Config files should be have their owner set to root:nova, and mode set to 0640, since they contain your MySQL server's root password. diff --git a/doc/source/devref/addmethod.openstackapi.rst b/doc/source/devref/addmethod.openstackapi.rst new file mode 100644 index 000000000..6484613df --- /dev/null +++ b/doc/source/devref/addmethod.openstackapi.rst @@ -0,0 +1,56 @@ +.. + Copyright 2010 OpenStack LLC + All Rights Reserved. + + 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. + +Adding a Method to the OpenStack API +==================================== + +The interface is a mostly RESTful API. REST stands for Representational State Transfer and provides an architecture "style" for distributed systems using HTTP for transport. Figure out a way to express your request and response in terms of resources that are being created, modified, read, or destroyed. + +Routing +------- + +To map URLs to controllers+actions, OpenStack uses the Routes package, a clone of Rails routes for Python implementations. See http://routes.groovie.org/ fore more information. + +URLs are mapped to "action" methods on "controller" classes in nova/api/openstack/__init__/ApiRouter.__init__ . + +See http://routes.groovie.org/manual.html for all syntax, but you'll probably just need these two: + - mapper.connect() lets you map a single URL to a single action on a controller. + - mapper.resource() connects many standard URLs to actions on a controller. + +Controllers and actions +----------------------- + +Controllers live in nova/api/openstack, and inherit from nova.wsgi.Controller. + +See nova/api/openstack/servers.py for an example. + +Action methods take parameters that are sucked out of the URL by mapper.connect() or .resource(). The first two parameters are self and the WebOb request, from which you can get the req.environ, req.body, req.headers, etc. + +Serialization +------------- + +Actions return a dictionary, and wsgi.Controller serializes that to JSON or XML based on the request's content-type. + +If you define a new controller, you'll need to define a _serialization_metadata attribute on the class, to tell wsgi.Controller how to convert your dictionary to XML. It needs to know the singular form of any list tag (e.g. <servers> list contains <server> tags) and which dictionary keys are to be XML attributes as opposed to subtags (e.g. <server id="4"/> instead of <server><id>4</id></server>). + +See nova/api/openstack/servers.py for an example. + +Faults +------ + +If you need to return a non-200, you should +return faults.Fault(webob.exc.HTTPNotFound()) +replacing the exception as appropriate. diff --git a/doc/source/devref/development.environment.rst b/doc/source/devref/development.environment.rst index 34104c964..6344c5382 100644 --- a/doc/source/devref/development.environment.rst +++ b/doc/source/devref/development.environment.rst @@ -15,7 +15,83 @@ License for the specific language governing permissions and limitations under the License. -Setting up a development environment +Setting Up a Development Environment ==================================== -.. todo:: write this +This page describes how to setup a working Python development environment that can be used in developing on OpenStack on Ubuntu or Mac OSX. These instructions assume you're already familiar with bzr and can pull down the code with an existing Launchpad account. Refer to http://wiki.openstack.org/LifeWithBzrAndLaunchpad for additional information. + +Linux Systems +------------- + +Note: This section is tested for Nova on Ubuntu 10.10-64. Feel free to add notes and change according to your experiences or operating system. + +Bring down the Nova source with bzr, then: +:: + cd <your_src_dir>/nova + sudo apt-get install python-dev swig libssl-dev python-pip + sudo easy_install nose + pip install virtualenv + python tools/install_venv.py + +If all goes well, you should get a message something like this: +:: + Nova development environment setup is complete. + +Nova development uses virtualenv to track and manage Python dependencies while in development and testing. Virtual env gives you an independent Python environment. + +To activate the Nova virtualenv for the extent of your current shell session + you can run:: + + $ source .nova-venv/bin/activate + + Or, if you prefer, you can run commands in the virtualenv on a case by case + basis by running:: + + $ tools/with_venv.sh <your command> + + Also, make test will automatically use the virtualenv. + +If you don't want to create a virtualenv every time you branch (which takes a while as long as we have the large Twisted project as a dependency) you can reuse a single virtualenv for all branches. + + #. If you don't have a nova/ directory containing trunk/ and other branches, do so now. + #. Go into nova/trunk and install a virtualenv. + #. Move it up a level: mv nova/trunk/.nova-venv nova/.nova-venv. + #. Symlink the ../nova/.nova-venv directory from your branch:: + + ~/openstack/nova/my_branch$ ln -s ../.nova-venv .nova-venv + +This works with run_tests.sh and nosetests -w nova/tests/api + +MacOSX Systems +-------------- + +First, install Virtual Env, which creates an isolated "standalone" Python environment.:: + + sudo easy_install virtualenv + + +Here's how to setup the code initially:: + + bzr branch lp:nova + cd nova + python tools/install_venv.py + source .nova_venv/bin/activate + pip install pep8 # submitting patch so that Nova has pep8 and pylint in PIP requirements file + pip install pylint + +If you have installed OpenSSL 1.0.0a on MacOS, which can happen when installing a MacPorts package for OpenSSL, you will see an error when running nova.tests.auth_unittest.AuthTestCase.test_209_can_generate_x509. The version that functions correctly is OpenSSL 0.9.8l 5, installed with MacOS 10.6 as a base element. + +Here's how to get the latest code:: + + cd nova + bzr pull # get the latest stuff... + source .nova_venv/bin/activate + ./run_tests.sh + +And then you can do cleaning work or hack hack hack with a branched named cleaning:: + + bzr push lp:~launchpaduserid/nova/cleaning + +To submit the merge/patch that you hacked upon: + * Navigate to https://code.launchpad.net/~launchpaduserid/nova/cleaning. + * Click on the link "Propose for merging". diff --git a/doc/source/devref/index.rst b/doc/source/devref/index.rst index 6a93e3e18..589609ace 100644 --- a/doc/source/devref/index.rst +++ b/doc/source/devref/index.rst @@ -23,8 +23,19 @@ In this section you will find information on Nova's lower level programming APIs Programming HowTos and Tutorials -------------------------------- +.. toctree:: + :maxdepth: 3 + + development.environment + addmethod.openstackapi + + +Programming Concepts +-------------------- +.. toctree:: + :maxdepth: 3 -.. todo:: Add some programming howtos and tuts + rabbit API Reference ------------- diff --git a/doc/source/devref/rabbit.rst b/doc/source/devref/rabbit.rst new file mode 100644 index 000000000..423284a55 --- /dev/null +++ b/doc/source/devref/rabbit.rst @@ -0,0 +1,150 @@ +.. + Copyright (c) 2010 Citrix Systems, Inc. + + 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. + +RabbitMQ and Nova +================= + +RabbitMQ is the messaging component chosen by the OpenStack cloud. RabbitMQ sits between any two Nova components and allows them to communicate in a loosely coupled fashion. More precisely, Nova components (the compute fabric of OpenStack) use Remote Procedure Calls (RPC hereinafter) to communicate to one another; however such a paradigm is built atop the publish/subscribe paradigm so that the following benefits can be achieved: + + * Decoupling between client and servant (such as the client does not need to know where the servant's reference is). + * Full a-synchronism between client and servant (such as the client does not need the servant to run at the same time of the remote call). + * Random balancing of remote calls (such as if more servants are up and running, one-way calls are transparently dispatched to the first available servant). + +Nova (Austin release) uses both direct and topic-based exchanges. The architecture looks like the one depicted in the figure below: + +.. image:: /images/rabbit/arch.png + :width: 60% + +.. + +Nova implements RPC (both request+response, and one-way, respectively nicknamed 'rpc.call' and 'rpc.cast') over AMQP by providing an adapter class which take cares of marshalling and unmarshalling of messages into function calls. Each Nova service (for example Compute, Volume, etc.) create two queues at the initialization time, one which accepts messages with routing keys 'NODE-TYPE.NODE-ID' (for example compute.hostname) and another, which accepts messages with routing keys as generic 'NODE-TYPE' (for example compute). The former is used specifically when Nova-API needs to redirect commands to a specific node like 'euca-terminate instance'. In this case, only the compute node whose host's hypervisor is running the virtual machine can kill the instance. The API acts as a consumer when RPC calls are request/response, otherwise is acts as publisher only. + +Nova RPC Mappings +----------------- + +The figure below shows the internals of a RabbitMQ node when a single instance is deployed and shared in an OpenStack cloud. Every Nova component connects to the RabbitMQ instance and, depending on its personality (for example a compute node or a network node), may use the queue either as an Invoker (such as API or Scheduler) or a Worker (such as Compute, Volume or Network). Invokers and Workers do not actually exist in the Nova object model, but we are going to use them as an abstraction for sake of clarity. An Invoker is a component that sends messages in the queuing system via two operations: 1) rpc.call and ii) rpc.cast; a Worker is a component that receives messages from the queuing system and reply accordingly to rcp.call operations. + +Figure 2 shows the following internal elements: + + * Topic Publisher: a Topic Publisher comes to life when an rpc.call or an rpc.cast operation is executed; this object is instantiated and used to push a message to the queuing system. Every publisher connects always to the same topic-based exchange; its life-cycle is limited to the message delivery. + * Direct Consumer: a Direct Consumer comes to life if (an only if) a rpc.call operation is executed; this object is instantiated and used to receive a response message from the queuing system; Every consumer connects to a unique direct-based exchange via a unique exclusive queue; its life-cycle is limited to the message delivery; the exchange and queue identifiers are determined by a UUID generator, and are marshalled in the message sent by the Topic Publisher (only rpc.call operations). + * Topic Consumer: a Topic Consumer comes to life as soon as a Worker is instantiated and exists throughout its life-cycle; this object is used to receive messages from the queue and it invokes the appropriate action as defined by the Worker role. A Topic Consumer connects to the same topic-based exchange either via a shared queue or via a unique exclusive queue. Every Worker has two topic consumers, one that is addressed only during rpc.cast operations (and it connects to a shared queue whose exchange key is 'topic') and the other that is addressed only during rpc.call operations (and it connects to a unique queue whose exchange key is 'topic.host'). + * Direct Publisher: a Direct Publisher comes to life only during rpc.call operations and it is instantiated to return the message required by the request/response operation. The object connects to a direct-based exchange whose identity is dictated by the incoming message. + * Topic Exchange: The Exchange is a routing table that exists in the context of a virtual host (the multi-tenancy mechanism provided by RabbitMQ); its type (such as topic vs. direct) determines the routing policy; a RabbitMQ node will have only one topic-based exchange for every topic in Nova. + * Direct Exchange: this is a routing table that is created during rpc.call operations; there are many instances of this kind of exchange throughout the life-cycle of a RabbitMQ node, one for each rpc.call invoked. + * Queue Element: A Queue is a message bucket. Messages are kept in the queue until a Consumer (either Topic or Direct Consumer) connects to the queue and fetch it. Queues can be shared or can be exclusive. Queues whose routing key is 'topic' are shared amongst Workers of the same personality. + +.. image:: /images/rabbit/rabt.png + :width: 60% + +.. + +RPC Calls +--------- + +The diagram below shows the message flow during an rp.call operation: + + 1. a Topic Publisher is instantiated to send the message request to the queuing system; immediately before the publishing operation, a Direct Consumer is instantiated to wait for the response message. + 2. once the message is dispatched by the exchange, it is fetched by the Topic Consumer dictated by the routing key (such as 'topic.host') and passed to the Worker in charge of the task. + 3. once the task is completed, a Direct Publisher is allocated to send the response message to the queuing system. + 4. once the message is dispatched by the exchange, it is fetched by the Direct Consumer dictated by the routing key (such as 'msg_id') and passed to the Invoker. + +.. image:: /images/rabbit/flow1.png + :width: 60% + +.. + +RPC Casts +--------- + +The diagram below the message flow during an rp.cast operation: + + 1. a Topic Publisher is instantiated to send the message request to the queuing system. + 2. once the message is dispatched by the exchange, it is fetched by the Topic Consumer dictated by the routing key (such as 'topic') and passed to the Worker in charge of the task. + +.. image:: /images/rabbit/flow2.png + :width: 60% + +.. + +RabbitMQ Load +------------- + +At any given time the load of a RabbitMQ node is function of the following parameters: + + * Throughput of API calls: the number of API calls (more precisely rpc.call ops) being served by the OpenStack cloud dictates the number of direct-based exchanges, related queues and direct consumers connected to them. + * Number of Workers: there is one queue shared amongst workers with the same personality; however there are as many exclusive queues as the number of workers; the number of workers dictates also the number of routing keys within the topic-based exchange, which is shared amongst all workers. + +The figure below shows the status of the RabbitMQ node after Nova components' bootstrap in a test environment. Exchanges and queues being created by Nova components are: + + * Exchanges + 1. nova (topic exchange) + * Queues + 1. compute.phantom (phantom is hostname) + 2. compute + 3. network.phantom (phantom is hostname) + 4. network + 5. volume.phantom (phantom is hostname) + 6. volume + 7. scheduler.phantom (phantom is hostname) + 8. scheduler + +.. image:: /images/rabbit/state.png + :width: 60% + +.. + +RabbitMQ Gotchas +---------------- + +Nova uses Carrot to connect to the RabbitMQ environment. Carrot is a Python library that in turn uses AMQPLib, a library that implements the standard AMQP 0.8 at the time of writing. When using Carrot, Invokers and Workers need the following parameters in order to instantiate a Connection object that connects to the RabbitMQ server (please note that most of the following material can be also found in the Carrot documentation; it has been summarized and revised here for sake of clarity): + + * Hostname: The hostname to the AMQP server. + * Userid: A valid username used to authenticate to the server. + * Password: The password used to authenticate to the server. + * Virtual_host: The name of the virtual host to work with. This virtual host must exist on the server, and the user must have access to it. Default is "/". + * Port: The port of the AMQP server. Default is 5672 (amqp). + +The following parameters are default: + + * Insist: insist on connecting to a server. In a configuration with multiple load-sharing servers, the Insist option tells the server that the client is insisting on a connection to the specified server. Default is False. + * Connect_timeout: the timeout in seconds before the client gives up connecting to the server. The default is no timeout. + * SSL: use SSL to connect to the server. The default is False. + +More precisely Consumers need the following parameters: + + * Connection: the above mentioned Connection object. + * Queue: name of the queue. + * Exchange: name of the exchange the queue binds to. + * Routing_key: the interpretation of the routing key depends on the value of the exchange_type attribute. + + * Direct exchange: if the routing key property of the message and the routing_key attribute of the queue are identical, then the message is forwarded to the queue. + * Fanout exchange: messages are forwarded to the queues bound the exchange, even if the binding does not have a key. + * Topic exchange: if the routing key property of the message matches the routing key of the key according to a primitive pattern matching scheme, then the message is forwarded to the queue. The message routing key then consists of words separated by dots (".", like domain names), and two special characters are available; star ("") and hash ("#"). The star matches any word, and the hash matches zero or more words. For example ".stock.#" matches the routing keys "usd.stock" and "eur.stock.db" but not "stock.nasdaq". + + * Durable: this flag determines the durability of both exchanges and queues; durable exchanges and queues remain active when a RabbitMQ server restarts. Non-durable exchanges/queues (transient exchanges/queues) are purged when a server restarts. It is worth noting that AMQP specifies that durable queues cannot bind to transient exchanges. Default is True. + * Auto_delete: if set, the exchange is deleted when all queues have finished using it. Default is False. + * Exclusive: exclusive queues (such as non-shared) may only be consumed from by the current connection. When exclusive is on, this also implies auto_delete. Default is False. + * Exchange_type: AMQP defines several default exchange types (routing algorithms) that covers most of the common messaging use cases. + * Auto_ack: acknowledgement is handled automatically once messages are received. By default auto_ack is set to False, and the receiver is required to manually handle acknowledgment. + * No_ack: it disable acknowledgement on the server-side. This is different from auto_ack in that acknowledgement is turned off altogether. This functionality increases performance but at the cost of reliability. Messages can get lost if a client dies before it can deliver them to the application. + * Auto_declare: if this is True and the exchange name is set, the exchange will be automatically declared at instantiation. Auto declare is on by default. + Publishers specify most the parameters of Consumers (such as they do not specify a queue name), but they can also specify the following: + * Delivery_mode: the default delivery mode used for messages. The value is an integer. The following delivery modes are supported by RabbitMQ: + + * 1 or "transient": the message is transient. Which means it is stored in memory only, and is lost if the server dies or restarts. + * 2 or "persistent": the message is persistent. Which means the message is stored both in-memory, and on disk, and therefore preserved if the server dies or restarts. + +The default value is 2 (persistent). During a send operation, Publishers can override the delivery mode of messages so that, for example, transient messages can be sent over a durable queue. diff --git a/doc/source/images/rabbit/arch.png b/doc/source/images/rabbit/arch.png Binary files differnew file mode 100644 index 000000000..8f7d535b6 --- /dev/null +++ b/doc/source/images/rabbit/arch.png diff --git a/doc/source/images/rabbit/arch.svg b/doc/source/images/rabbit/arch.svg new file mode 100644 index 000000000..efed6e981 --- /dev/null +++ b/doc/source/images/rabbit/arch.svg @@ -0,0 +1,292 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<!-- Generated by Microsoft Visio 11.0, SVG Export, v1.0 arch.svg Page-1 -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"
+ xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="7.88068in" height="4.96134in"
+ viewBox="0 0 567.409 357.217" xml:space="preserve" color-interpolation-filters="sRGB" class="st16">
+ <v:documentProperties v:langID="2057" v:metric="true" v:viewMarkup="false"/>
+
+ <style type="text/css">
+ <![CDATA[
+ .st1 {fill:#dde2cd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}
+ .st2 {fill:#000000;font-family:Arial;font-size:1.16666em}
+ .st3 {font-size:1em}
+ .st4 {stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.25}
+ .st5 {fill:#ffffff;stroke:none;stroke-linecap:butt;stroke-width:7.2}
+ .st6 {fill:#000000;font-family:Arial;font-size:0.666664em}
+ .st7 {fill:#ffffff;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}
+ .st8 {fill:#000000;font-family:Arial;font-size:1.00001em}
+ .st9 {fill:none;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st10 {fill:#000000;font-family:Calibri;font-size:0.833336em}
+ .st11 {fill:#4677bf}
+ .st12 {stroke:#4677bf;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.72}
+ .st13 {marker-end:url(#mrkr10-82);marker-start:url(#mrkr10-80);stroke:#4677bf;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.72}
+ .st14 {fill:#4677bf;fill-opacity:1;stroke:#4677bf;stroke-opacity:1;stroke-width:0.22222222222222}
+ .st15 {fill:#000000;font-family:Calibri;font-size:0.666664em}
+ .st16 {fill:none;fill-rule:evenodd;font-size:12;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
+ ]]>
+ </style>
+
+ <defs id="Markers">
+ <g id="lend10">
+ <path
+ d="M 0 0.75 C -0.414214 0.75 -0.75 0.414214 -0.75 0 -0.75 -0.414214 -0.414214 -0.75 0 -0.75 0.414214 -0.75 0.75 -0.414214 0.75 0 0.75 0.414214 0.414214 0.75 0 0.75 Z "
+ style="stroke:none"/>
+ </g>
+ <marker id="mrkr10-80" class="st14" v:arrowType="10" v:arrowSize="2" v:setback="2.875" refX="2.875" orient="auto"
+ markerUnits="strokeWidth">
+ <use xlink:href="#lend10" transform="scale(4.5) "/>
+ </marker>
+ <marker id="mrkr10-82" class="st14" v:arrowType="10" v:arrowSize="2" v:setback="3.375" refX="-3.375" orient="auto"
+ markerUnits="strokeWidth">
+ <use xlink:href="#lend10" transform="scale(-4.5,-4.5) "/>
+ </marker>
+ </defs>
+ <g v:mID="0" v:index="1" v:groupContext="foregroundPage">
+ <title>Page-1</title>
+ <v:pageProperties v:drawingScale="0.0393701" v:pageScale="0.0393701" v:drawingUnits="24" v:shadowOffsetX="8.50394"
+ v:shadowOffsetY="-8.50394"/>
+ <v:layer v:name="Connector" v:index="0"/>
+ <g id="shape1-1" v:mID="1" v:groupContext="shape" transform="translate(453.783,-16.819)">
+ <title>Box.8</title>
+ <desc>Compute</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(11):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="56.6929" cy="328.87" width="113.39" height="56.6929"/>
+ <rect x="0" y="300.524" width="113.386" height="56.6929" class="st1"/>
+ <text x="28.29" y="333.07" class="st2" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Compute</text> </g>
+ <g id="shape2-4" v:mID="2" v:groupContext="shape" transform="translate(453.783,-300.284)">
+ <title>Box.2</title>
+ <desc>Volume Storage</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(11):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="56.6929" cy="328.87" width="113.39" height="56.6929"/>
+ <rect x="0" y="300.524" width="113.386" height="56.6929" class="st1"/>
+ <text x="32.96" y="324.67" class="st2" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Volume<v:newlineChar/><tspan
+ x="32.18" dy="1.2em" class="st3">Storage</tspan></text> </g>
+ <g id="shape3-8" v:mID="3" v:groupContext="shape" transform="translate(269.531,-300.284)">
+ <title>Box</title>
+ <desc>Auth Manager</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(11):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="56.6929" cy="328.87" width="113.39" height="56.6929"/>
+ <rect x="0" y="300.524" width="113.386" height="56.6929" class="st1"/>
+ <text x="12.72" y="333.07" class="st2" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Auth Manager</text> </g>
+ <g id="shape4-11" v:mID="4" v:groupContext="shape" transform="translate(269.531,-158.551)">
+ <title>Box.4</title>
+ <desc>Cloud Controller</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(11):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="56.6929" cy="328.87" width="113.39" height="56.6929"/>
+ <rect x="0" y="300.524" width="113.386" height="56.6929" class="st1"/>
+ <text x="38.4" y="324.67" class="st2" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Cloud<v:newlineChar/><tspan
+ x="26.35" dy="1.2em" class="st3">Controller</tspan></text> </g>
+ <g id="shape5-15" v:mID="5" v:groupContext="shape" transform="translate(99.4526,-158.551)">
+ <title>Box.3</title>
+ <desc>API Server</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(11):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="56.6929" cy="328.87" width="113.39" height="56.6929"/>
+ <rect x="0" y="300.524" width="113.386" height="56.6929" class="st1"/>
+ <text x="22.85" y="333.07" class="st2" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>API Server</text> </g>
+ <g id="shape6-18" v:mID="6" v:groupContext="shape" transform="translate(269.531,-2.64582)">
+ <title>Box.6</title>
+ <desc>Object Store</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(11):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="56.6929" cy="328.87" width="113.39" height="56.6929"/>
+ <rect x="0" y="300.524" width="113.386" height="56.6929" class="st1"/>
+ <text x="36.46" y="324.67" class="st2" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Object<v:newlineChar/><tspan
+ x="39.96" dy="1.2em" class="st3">Store</tspan></text> </g>
+ <g id="shape7-22" v:mID="7" v:groupContext="shape" transform="translate(439.61,-2.64582)">
+ <title>Box.7</title>
+ <desc>Node Controller</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(11):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="56.6929" cy="328.87" width="113.39" height="56.6929"/>
+ <rect x="0" y="300.524" width="113.386" height="56.6929" class="st1"/>
+ <text x="39.96" y="324.67" class="st2" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Node<v:newlineChar/><tspan
+ x="26.35" dy="1.2em" class="st3">Controller</tspan></text> </g>
+ <g id="shape8-26" v:mID="8" v:groupContext="shape" v:layerMember="0" transform="translate(319.138,-300.284)">
+ <title>Dynamic connector</title>
+ <path d="M7.09 357.22 L7.09 442.26" class="st4"/>
+ </g>
+ <g id="shape9-29" v:mID="9" v:groupContext="shape" v:layerMember="0" transform="translate(212.838,-179.811)">
+ <title>Dynamic connector.11</title>
+ <path d="M0 350.13 L56.69 350.13" class="st4"/>
+ </g>
+ <g id="shape10-32" v:mID="10" v:groupContext="shape" v:layerMember="0" transform="translate(319.138,-158.551)">
+ <title>Dynamic connector.12</title>
+ <desc>http</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="7.08661" cy="406.823" width="40" height="17.6036"/>
+ <path d="M7.09 357.22 L7.09 456.43" class="st4"/>
+ <rect v:rectContext="textBkgnd" x="0.414953" y="402.023" width="13.3434" height="9.59985" class="st5"/>
+ <text x="0.41" y="409.22" class="st6" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>http</text> </g>
+ <g id="shape11-37" v:mID="11" v:groupContext="shape" transform="translate(0.24,-314.457)">
+ <title>Circle</title>
+ <desc>Nova-Manage</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(11):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="42.5197" cy="343.043" width="85.04" height="28.3465"/>
+ <path d="M0 343.04 A42.5197 14.1732 0 0 1 85.04 343.04 A42.5197 14.1732 0 0 1 0 343.04 Z" class="st7"/>
+ <text x="4.83" y="346.64" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Nova-Manage</text> </g>
+ <g id="shape12-40" v:mID="12" v:groupContext="shape" transform="translate(0.24,-101.858)">
+ <title>Circle.15</title>
+ <desc>Euca2ools</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(11):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="42.5197" cy="343.043" width="85.04" height="28.3465"/>
+ <path d="M0 343.04 A42.5197 14.1732 0 0 1 85.04 343.04 A42.5197 14.1732 0 0 1 0 343.04 Z" class="st7"/>
+ <text x="14.5" y="346.64" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Euca2ools</text> </g>
+ <g id="shape13-43" v:mID="13" v:groupContext="shape" v:layerMember="0" transform="translate(85.2794,-321.543)">
+ <title>Dynamic connector.16</title>
+ <path d="M0 350.13 L184.25 350.13" class="st4"/>
+ </g>
+ <g id="shape14-46" v:mID="14" v:groupContext="shape" v:layerMember="0" transform="translate(42.7597,-130.205)">
+ <title>Dynamic connector.17</title>
+ <path d="M0 357.22 L0 300.52 L56.69 300.52" class="st4"/>
+ </g>
+ <g id="shape15-49" v:mID="15" v:groupContext="shape" transform="translate(22.8857,-254.929)">
+ <title>Sheet.15</title>
+ <desc>Project User Role Network VPN</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="31.1969" cy="340.209" width="62.4" height="34.0157"/>
+ <rect x="0" y="323.201" width="62.3937" height="34.0157" class="st9"/>
+ <text x="4" y="319.21" class="st10" v:langID="2057"><v:paragraph/><v:tabList/>Project<v:newlineChar/><tspan x="4"
+ dy="1.2em" class="st3">User<v:newlineChar/></tspan><tspan x="4" dy="1.2em" class="st3">Role<v:newlineChar/></tspan><tspan
+ x="4" dy="1.2em" class="st3">Network<v:newlineChar/></tspan><tspan x="4" dy="1.2em" class="st3">VPN</tspan></text> </g>
+ <g id="shape16-56" v:mID="16" v:groupContext="shape" transform="translate(14.4132,-30.9923)">
+ <title>Sheet.16</title>
+ <desc>VM instance Security group Volume Snapshot VM image IP addres...</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="42.5197" cy="340.209" width="85.04" height="34.0157"/>
+ <rect x="0" y="323.201" width="85.0394" height="34.0157" class="st9"/>
+ <text x="4" y="301.21" class="st10" v:langID="2057"><v:paragraph/><v:tabList/>VM instance<v:newlineChar/><tspan x="4"
+ dy="1.2em" class="st3">Security group<v:newlineChar/></tspan><tspan x="4" dy="1.2em" class="st3">Volume<v:newlineChar/></tspan><tspan
+ x="4" dy="1.2em" class="st3">Snapshot<v:newlineChar/></tspan><tspan x="4" dy="1.2em" class="st3">VM image<v:newlineChar/></tspan><tspan
+ x="4" dy="1.2em" class="st3">IP address<v:newlineChar/></tspan><tspan x="4" dy="1.2em" class="st3">SSH key<v:newlineChar/></tspan><tspan
+ x="4" dy="1.2em" class="st3">Availability zone</tspan></text> </g>
+ <g id="shape17-66" v:mID="17" v:groupContext="shape" transform="translate(439.61,-158.551)">
+ <title>Box.20</title>
+ <desc>Network Controller</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(11):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="56.6929" cy="328.87" width="113.39" height="56.6929"/>
+ <rect x="0" y="300.524" width="113.386" height="56.6929" class="st1"/>
+ <text x="31.02" y="324.67" class="st2" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Network <tspan
+ x="26.35" dy="1.2em" class="st3">Controller</tspan></text> </g>
+ <g id="shape18-70" v:mID="18" v:groupContext="shape" transform="translate(439.61,-286.11)">
+ <title>Box.5</title>
+ <desc>Storage Controller</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(11):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="56.6929" cy="328.87" width="113.39" height="56.6929"/>
+ <rect x="0" y="300.524" width="113.386" height="56.6929" class="st1"/>
+ <text x="32.18" y="324.67" class="st2" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Storage <tspan
+ x="26.35" dy="1.2em" class="st3">Controller</tspan></text> </g>
+ <g id="shape19-74" v:mID="19" v:groupContext="shape" transform="translate(718.627,48.2425) rotate(70.0169)">
+ <title>Dot & arrow</title>
+ <v:userDefs>
+ <v:ud v:nameU="ControlX" v:val="VT0(0.059055118110236):24"/>
+ <v:ud v:nameU="Scale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="AntiScale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="visVersion" v:val="VT0(11):26"/>
+ </v:userDefs>
+ <path d="M-4.25 357.22 A4.25197 4.25197 -180 1 0 4.25 357.22 A4.25197 4.25197 -180 0 0 -4.25 357.22 ZM157.39 352.96 L157.39
+ 361.47 L165.89 357.22 L157.39 352.96 Z" class="st11"/>
+ <path d="M-4.25 357.22 A4.25197 4.25197 -180 1 0 4.25 357.22 A4.25197 4.25197 -180 0 0 -4.25 357.22" class="st12"/>
+ <path d="M157.39 352.96 L157.39 361.47 L165.89 357.22 L157.39 352.96" class="st12"/>
+ <path d="M6.32 357.22 L6.68 357.22 L154.96 357.22" class="st13"/>
+ </g>
+ <g id="shape20-85" v:mID="20" v:groupContext="shape" transform="translate(56.4886,25.2394) rotate(-66.0375)">
+ <title>Dot & arrow.14</title>
+ <v:userDefs>
+ <v:ud v:nameU="ControlX" v:val="VT0(0.059055118110236):24"/>
+ <v:ud v:nameU="Scale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="AntiScale" v:val="VT0(1):26"/>
+ <v:ud v:nameU="visVersion" v:val="VT0(11):26"/>
+ </v:userDefs>
+ <path d="M-4.25 357.22 A4.25197 4.25197 -180 1 0 4.25 357.22 A4.25197 4.25197 -180 0 0 -4.25 357.22 ZM131.09 352.96 L131.09
+ 361.47 L139.59 357.22 L131.09 352.96 Z" class="st11"/>
+ <path d="M-4.25 357.22 A4.25197 4.25197 -180 1 0 4.25 357.22 A4.25197 4.25197 -180 0 0 -4.25 357.22" class="st12"/>
+ <path d="M131.09 352.96 L131.09 361.47 L139.59 357.22 L131.09 352.96" class="st12"/>
+ <path d="M6.32 357.22 L6.68 357.22 L128.66 357.22" class="st13"/>
+ </g>
+ <g id="shape21-94" v:mID="21" v:groupContext="shape" v:layerMember="0" transform="translate(382.917,-179.811)">
+ <title>Dynamic connector.13</title>
+ <path d="M0 350.13 L56.69 350.13" class="st4"/>
+ </g>
+ <g id="shape22-97" v:mID="22" v:groupContext="shape" transform="translate(386.681,-128.378)">
+ <title>Sheet.22</title>
+ <desc>AMQP</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="24.5827" cy="349.217" width="49.17" height="16"/>
+ <rect x="0" y="341.217" width="49.1654" height="16" class="st9"/>
+ <text x="14.09" y="351.62" class="st15" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>AMQP</text> </g>
+ <g id="shape23-100" v:mID="23" v:groupContext="shape" transform="translate(383.492,-243.591)">
+ <title>Sheet.23</title>
+ <desc>AMQP</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="27.7717" cy="349.217" width="55.55" height="16"/>
+ <rect x="0" y="341.217" width="55.5433" height="16" class="st9"/>
+ <text x="17.28" y="351.62" class="st15" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>AMQP</text> </g>
+ <g id="shape24-103" v:mID="24" v:groupContext="shape" transform="translate(390.445,-178.898)">
+ <title>Sheet.24</title>
+ <desc>AMQP</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="24.5827" cy="349.217" width="49.17" height="16"/>
+ <rect x="0" y="341.217" width="49.1654" height="16" class="st9"/>
+ <text x="14.09" y="351.62" class="st15" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>AMQP</text> </g>
+ <g id="shape25-106" v:mID="25" v:groupContext="shape" transform="translate(28.5865,-185.071)">
+ <title>Sheet.25</title>
+ <desc>REST</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="27.7717" cy="349.217" width="55.55" height="16"/>
+ <rect x="0" y="341.217" width="55.5433" height="16" class="st9"/>
+ <text x="19.86" y="351.62" class="st15" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>REST</text> </g>
+ <g id="shape26-109" v:mID="26" v:groupContext="shape" transform="translate(156.146,-328.63)">
+ <title>Sheet.26</title>
+ <desc>local method</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="27.7717" cy="349.217" width="55.55" height="16"/>
+ <rect x="0" y="341.217" width="55.5433" height="16" class="st9"/>
+ <text x="6.48" y="351.62" class="st15" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>local method</text> </g>
+ <g id="shape27-112" v:mID="27" v:groupContext="shape" transform="translate(297.878,-243.591)">
+ <title>Sheet.27</title>
+ <desc>local method</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="27.7717" cy="349.217" width="55.55" height="16"/>
+ <rect x="0" y="341.217" width="55.5433" height="16" class="st9"/>
+ <text x="6.48" y="351.62" class="st15" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>local method</text> </g>
+ <g id="shape28-115" v:mID="28" v:groupContext="shape" transform="translate(213.988,-185.071)">
+ <title>Sheet.28</title>
+ <desc>local method</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="27.7717" cy="349.217" width="55.55" height="16"/>
+ <rect x="0" y="341.217" width="55.5433" height="16" class="st9"/>
+ <text x="6.48" y="351.62" class="st15" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>local method</text> </g>
+ </g>
+</svg>
diff --git a/doc/source/images/rabbit/flow1.png b/doc/source/images/rabbit/flow1.png Binary files differnew file mode 100644 index 000000000..ea325ad08 --- /dev/null +++ b/doc/source/images/rabbit/flow1.png diff --git a/doc/source/images/rabbit/flow1.svg b/doc/source/images/rabbit/flow1.svg new file mode 100644 index 000000000..6d8f7e280 --- /dev/null +++ b/doc/source/images/rabbit/flow1.svg @@ -0,0 +1,617 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<!-- Generated by Microsoft Visio 11.0, SVG Export, v1.0 flow1.svg Page-1 -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"
+ xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="10.4093in" height="3.59931in"
+ viewBox="0 0 749.472 259.15" xml:space="preserve" color-interpolation-filters="sRGB" class="st23">
+ <v:documentProperties v:langID="2057" v:metric="true" v:viewMarkup="false"/>
+
+ <style type="text/css">
+ <![CDATA[
+ .st1 {fill:#e8eef7;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}
+ .st2 {fill:#ff00ff;fill-opacity:0;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0;stroke-width:0.72}
+ .st3 {fill:url(#grad31-9);stroke:#ffffff;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.72}
+ .st4 {fill:url(#grad30-15);stroke:#ffffff;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.72}
+ .st5 {fill:url(#grad32-19);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.72}
+ .st6 {stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st7 {fill:#ff0000;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}
+ .st8 {fill:#000000;font-family:Calibri;font-size:1.00001em}
+ .st9 {font-size:1em}
+ .st10 {fill:#ffffff;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}
+ .st11 {marker-start:url(#mrkr13-65);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st12 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.22935779816514}
+ .st13 {fill:none;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st14 {marker-end:url(#mrkr13-77);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st15 {marker-end:url(#mrkr1-91);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st16 {stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st17 {fill:none;stroke:#000000;stroke-dasharray:3.6,2.16;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}
+ .st18 {fill:#d8d8d8;stroke:#c00000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st19 {fill:#000000;font-family:Calibri;font-size:1.5em}
+ .st20 {marker-end:url(#mrkr13-190);stroke:#ff0000;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.25}
+ .st21 {fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-opacity:1;stroke-width:0.47169811320755}
+ .st22 {marker-start:url(#mrkr13-205);stroke:#ff0000;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.25}
+ .st23 {fill:none;fill-rule:evenodd;font-size:12;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
+ ]]>
+ </style>
+
+ <defs id="Patterns_And_Gradients">
+ <pattern id="grad31-9" v:fillPattern="31" v:foreground="#ffffff" v:background="#a7a7a7" x="0" y="0" width="1" height="1"
+ patternContentUnits="objectBoundingBox">
+ <path d="M 0 0 L 0 1 L 1 1 z" style="fill:url(#grad28-10)"/>
+ <path d="M 0 0 L 1 0 L 1 1 z" style="fill:url(#grad25-11)"/>
+ </pattern>
+ <linearGradient id="grad28-10" v:fillPattern="31" v:foreground="#ffffff" v:background="#a7a7a7" x1="0" y1="0" x2="0" y2="1">
+ <stop offset="0" style="stop-color:#ffffff;stop-opacity:1"/>
+ <stop offset="1" style="stop-color:#a7a7a7;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="grad25-11" v:fillPattern="31" v:foreground="#ffffff" v:background="#a7a7a7" x1="0" y1="0" x2="1" y2="0">
+ <stop offset="0" style="stop-color:#ffffff;stop-opacity:1"/>
+ <stop offset="1" style="stop-color:#a7a7a7;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="grad30-15" v:fillPattern="30" v:foreground="#ffffff" v:background="#dfdfdf" x1="0" y1="1" x2="0" y2="0">
+ <stop offset="0" style="stop-color:#ffffff;stop-opacity:1"/>
+ <stop offset="1" style="stop-color:#dfdfdf;stop-opacity:1"/>
+ </linearGradient>
+ <pattern id="grad32-19" v:fillPattern="32" v:foreground="#ffffff" v:background="#c0c0c0" x="0" y="0" width="1" height="1"
+ patternContentUnits="objectBoundingBox">
+ <path d="M 0 1 L 0 0 L 1 0 z" style="fill:url(#grad27-20)"/>
+ <path d="M 0 1 L 1 1 L 1 0 z" style="fill:url(#grad28-21)"/>
+ </pattern>
+ <linearGradient id="grad27-20" v:fillPattern="32" v:foreground="#ffffff" v:background="#c0c0c0" x1="1" y1="0" x2="0" y2="0">
+ <stop offset="0" style="stop-color:#ffffff;stop-opacity:1"/>
+ <stop offset="1" style="stop-color:#c0c0c0;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="grad28-21" v:fillPattern="32" v:foreground="#ffffff" v:background="#c0c0c0" x1="0" y1="0" x2="0" y2="1">
+ <stop offset="0" style="stop-color:#ffffff;stop-opacity:1"/>
+ <stop offset="1" style="stop-color:#c0c0c0;stop-opacity:1"/>
+ </linearGradient>
+ </defs>
+ <defs id="Markers">
+ <g id="lend13">
+ <path d="M 3 1 L 0 0 L 3 -1 L 3 1 " style="stroke:none"/>
+ </g>
+ <marker id="mrkr13-65" class="st12" v:arrowType="13" v:arrowSize="2" v:setback="12.6" refX="12.6" orient="auto"
+ markerUnits="strokeWidth">
+ <use xlink:href="#lend13" transform="scale(4.36) "/>
+ </marker>
+ <marker id="mrkr13-77" class="st12" v:arrowType="13" v:arrowSize="2" v:setback="13.08" refX="-13.08" orient="auto"
+ markerUnits="strokeWidth">
+ <use xlink:href="#lend13" transform="scale(-4.36,-4.36) "/>
+ </marker>
+ <g id="lend1">
+ <path d="M 1 -1 L 0 0 L 1 1 " style="stroke-linecap:round;stroke-linejoin:round;fill:none"/>
+ </g>
+ <marker id="mrkr1-91" class="st12" v:arrowType="1" v:arrowSize="2" orient="auto" markerUnits="strokeWidth">
+ <use xlink:href="#lend1" transform="scale(-4.36,-4.36) "/>
+ </marker>
+ <marker id="mrkr13-190" class="st21" v:arrowType="13" v:arrowSize="2" v:setback="6.36" refX="-6.36" orient="auto"
+ markerUnits="strokeWidth">
+ <use xlink:href="#lend13" transform="scale(-2.12,-2.12) "/>
+ </marker>
+ <marker id="mrkr13-205" class="st21" v:arrowType="13" v:arrowSize="2" v:setback="6.2" refX="6.2" orient="auto"
+ markerUnits="strokeWidth">
+ <use xlink:href="#lend13" transform="scale(2.12) "/>
+ </marker>
+ </defs>
+ <g v:mID="0" v:index="1" v:groupContext="foregroundPage">
+ <title>Page-1</title>
+ <v:pageProperties v:drawingScale="0.0393701" v:pageScale="0.0393701" v:drawingUnits="24" v:shadowOffsetX="8.50394"
+ v:shadowOffsetY="-8.50394"/>
+ <g id="shape1-1" v:mID="1" v:groupContext="shape" transform="translate(247.525,-23.6348)">
+ <title>Rounded rectangle</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <path d="M297.64 259.15 A14.1733 14.1733 -180 0 0 311.81 244.98 L311.81 38.05 A14.1733 14.1733 -180 0 0 297.64 23.87
+ L14.17 23.87 A14.1733 14.1733 -180 0 0 -0 38.05 L0 244.98 A14.1733 14.1733 -180 0 0 14.17 259.15 L297.64
+ 259.15 Z" class="st1"/>
+ </g>
+ <g id="group2-3" transform="translate(304.218,-162.532)" v:mID="2" v:groupContext="group">
+ <v:custProps>
+ <v:cp v:nameU="ShapeClass" v:lbl="ShapeClass" v:type="0" v:invis="true" v:ask="false" v:langID="1033"
+ v:val="VT4(Equipment)"/>
+ <v:cp v:nameU="ShapeType" v:lbl="ShapeType" v:type="0" v:invis="true" v:ask="false" v:langID="1033"
+ v:val="VT4(Device)"/>
+ <v:cp v:nameU="SubShapeType" v:lbl="SubShapeType" v:type="0" v:invis="true" v:ask="false" v:langID="1033"
+ v:val="VT4(Switch)"/>
+ <v:cp v:nameU="Manufacturer" v:lbl="Manufacturer" v:type="0" v:sortKey="Equipment" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="ProductNumber" v:lbl="Product Number" v:type="0" v:sortKey="Equipment" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="PartNumber" v:lbl="Part Number" v:type="0" v:sortKey="Equipment" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="ProductDescription" v:lbl="Product Description" v:type="0" v:sortKey="Equipment" v:invis="false"
+ v:ask="false" v:langID="1033"/>
+ <v:cp v:nameU="AssetNumber" v:lbl="Asset Number" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="SerialNumber" v:lbl="Serial Number" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="Location" v:lbl="Location" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="Building" v:lbl="Building" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="Room" v:lbl="Room" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false" v:langID="1033"/>
+ <v:cp v:nameU="NetworkName" v:lbl="Network Name" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="IPAddress" v:lbl="IP Address" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="SubnetMask" v:lbl="Subnet Mask" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="AdminInterface" v:lbl="Administrative Interface" v:type="0" v:sortKey="Network" v:invis="false"
+ v:ask="false" v:langID="1033"/>
+ <v:cp v:nameU="NumberOfPorts" v:lbl="Number of Ports" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="MACAddress" v:lbl="MAC Address" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="CommunityString" v:lbl="Community String" v:type="0" v:sortKey="Network" v:invis="false"
+ v:ask="false" v:langID="1033"/>
+ <v:cp v:nameU="NetworkDescription" v:lbl="Network Description" v:type="0" v:sortKey="Network" v:invis="false"
+ v:ask="false" v:langID="1033"/>
+ </v:custProps>
+ <v:userDefs>
+ <v:ud v:nameU="HasText" v:val="VT0(1):5"/>
+ <v:ud v:nameU="ShapeClass" v:val="VT0(5):26"/>
+ <v:ud v:nameU="ShapeType" v:val="VT0(8):26"/>
+ <v:ud v:nameU="SubShapeType" v:val="VT0(66):26"/>
+ <v:ud v:nameU="visLegendShape" v:val="VT0(2):26"/>
+ <v:ud v:nameU="SolSH" v:val="VT14({BF0433D9-CD73-4EB5-8390-8653BE590246}):41"/>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <title>ATM switch</title>
+ <desc>name: control_exchange (type: topic)</desc>
+ <g id="shape3-4" v:mID="3" v:groupContext="shape" transform="translate(-0.359055,0)">
+ <title>Sheet.3</title>
+ <path d="M28.35 259.15 L42.52 250.97 L42.52 218.82 L14.17 202.46 L0 210.64 L0 242.78 L28.35 259.15 Z" class="st2"/>
+ </g>
+ <g id="shape4-6" v:mID="4" v:groupContext="shape" transform="translate(28.1575,-0.0944882)">
+ <title>Sheet.4</title>
+ <path d="M0 227.01 L0 259.15 L14.17 250.97 L14.17 218.82 L0 227.01 Z" class="st3"/>
+ </g>
+ <g id="shape5-12" v:mID="5" v:groupContext="shape" transform="translate(-0.188976,-32.2386)">
+ <title>Sheet.5</title>
+ <path d="M0 242.78 L28.35 259.15 L42.52 250.97 L14.17 234.6 L0 242.78 Z" class="st4"/>
+ </g>
+ <g id="shape6-16" v:mID="6" v:groupContext="shape" transform="translate(-0.188976,-0.0944882)">
+ <title>Sheet.6</title>
+ <path d="M0 242.78 L28.35 259.15 L28.35 227.01 L0 210.64 L0 242.78 Z" class="st5"/>
+ </g>
+ <g id="shape7-22" v:mID="7" v:groupContext="shape" transform="translate(-0.188976,-0.0944882)">
+ <title>Sheet.7</title>
+ <path d="M0 210.64 L0 242.78 L28.35 259.15 L42.52 250.97 L42.52 218.82 L14.17 202.46 L0 210.64" class="st6"/>
+ </g>
+ <g id="shape8-25" v:mID="8" v:groupContext="shape" transform="translate(1.88976,-6.80315)">
+ <title>Sheet.8</title>
+ <path d="M4.05 223.81 L0 226.12 L4.05 233.09 L4.05 229.38 L7.09 231.13 L11.14 240.9 L7.09 245.98 L4.05 244.23 L4.05
+ 240.52 L0 242.82 L4.05 249.8 L4.05 246.09 A59.6713 55.5985 -178.23 0 0 8.1 248.42 L12.15 243.34 L16.2
+ 253.1 L20.25 255.44 L20.25 259.15 L24.3 256.85 L20.25 249.87 L20.25 253.58 L17.21 251.83 L13.16 242.07
+ L17.21 236.98 L20.25 238.73 L20.25 242.45 L24.3 240.14 L20.25 233.16 L20.25 236.88 L16.2 234.54 A89.6201
+ 83.5031 -177.36 0 0 12.15 239.63 L8.1 229.86 L4.05 227.53 L4.05 223.81 Z" class="st7"/>
+ </g>
+ <g id="shape2-27" v:mID="2" v:groupContext="groupContent">
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="21.2598" cy="277.552" width="131.44" height="36.8038"/>
+ <text x="-39.1" y="273.95" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>name: control_exchange<v:newlineChar/><tspan
+ x="-8.44" dy="1.2em" class="st9">(</tspan>type: topic)</text> </g>
+ </g>
+ <g id="group9-30" transform="translate(465.793,-205.052)" v:mID="9" v:groupContext="group">
+ <title>Sheet.9</title>
+ <g id="shape10-31" v:mID="10" v:groupContext="shape">
+ <title>Rectangle</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape11-33" v:mID="11" v:groupContext="shape" transform="translate(8.50394,-5.68434E-014)">
+ <title>Rectangle.10</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape12-35" v:mID="12" v:groupContext="shape" transform="translate(17.0079,-5.68434E-014)">
+ <title>Rectangle.11</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape13-37" v:mID="13" v:groupContext="shape" transform="translate(25.5118,-5.68434E-014)">
+ <title>Rectangle.12</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape14-39" v:mID="14" v:groupContext="shape" transform="translate(34.0157,-5.68434E-014)">
+ <title>Rectangle.13</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape15-41" v:mID="15" v:groupContext="shape" transform="translate(42.5197,-5.68434E-014)">
+ <title>Rectangle.14</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape16-43" v:mID="16" v:groupContext="shape" transform="translate(51.0236,-5.68434E-014)">
+ <title>Rectangle.15</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ </g>
+ <g id="group17-45" transform="translate(465.793,-139.855)" v:mID="17" v:groupContext="group">
+ <title>Sheet.17</title>
+ <g id="shape18-46" v:mID="18" v:groupContext="shape">
+ <title>Rectangle</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape19-48" v:mID="19" v:groupContext="shape" transform="translate(8.50394,-5.68434E-014)">
+ <title>Rectangle.10</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape20-50" v:mID="20" v:groupContext="shape" transform="translate(17.0079,-5.68434E-014)">
+ <title>Rectangle.11</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape21-52" v:mID="21" v:groupContext="shape" transform="translate(25.5118,-5.68434E-014)">
+ <title>Rectangle.12</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape22-54" v:mID="22" v:groupContext="shape" transform="translate(34.0157,-5.68434E-014)">
+ <title>Rectangle.13</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape23-56" v:mID="23" v:groupContext="shape" transform="translate(42.5197,-5.68434E-014)">
+ <title>Rectangle.14</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape24-58" v:mID="24" v:groupContext="shape" transform="translate(51.0236,-5.68434E-014)">
+ <title>Rectangle.15</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ </g>
+ <g id="shape25-60" v:mID="25" v:groupContext="shape" transform="translate(360.911,-193.714)">
+ <title>Sheet.25</title>
+ <path d="M9.45 259.15 L9.81 259.15 L56.69 259.15 L56.69 230.8 L96.38 230.8 L104.88 230.8" class="st11"/>
+ </g>
+ <g id="shape26-66" v:mID="26" v:groupContext="shape" transform="translate(445.95,-189.462)">
+ <title>Sheet.26</title>
+ <desc>key: topic</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="49.6063" cy="252.064" width="99.22" height="14.1732"/>
+ <rect x="0" y="244.977" width="99.2126" height="14.1732" class="st13"/>
+ <text x="25.98" y="255.66" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>key: topic</text> </g>
+ <g id="shape27-69" v:mID="27" v:groupContext="shape" transform="translate(454.454,-119.855)">
+ <title>Sheet.27</title>
+ <desc>key: topic.host</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="41.1024" cy="249.15" width="82.21" height="20"/>
+ <rect x="0" y="239.15" width="82.2047" height="20" class="st13"/>
+ <text x="5.28" y="252.75" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>key: topic.host</text> </g>
+ <g id="shape28-72" v:mID="28" v:groupContext="shape" transform="translate(360.911,-156.863)">
+ <title>Sheet.28</title>
+ <path d="M96.38 259.15 L56.69 259.15 L56.69 230.8 L9.81 230.8" class="st14"/>
+ </g>
+ <g id="shape29-78" v:mID="29" v:groupContext="shape" transform="translate(630.202,-200.8)">
+ <title>Rectangle</title>
+ <desc>Topic Consumer</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="42.5197" cy="237.891" width="85.04" height="42.5197"/>
+ <rect x="0" y="216.631" width="85.0394" height="42.5197" class="st1"/>
+ <text x="29.37" y="234.29" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Topic <tspan
+ x="17.63" dy="1.2em" class="st9">Consumer</tspan></text> </g>
+ <g id="shape30-82" v:mID="30" v:groupContext="shape" transform="translate(630.202,-135.603)">
+ <title>Rectangle.30</title>
+ <desc>Topic Consumer</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="42.5197" cy="237.891" width="85.04" height="42.5197"/>
+ <rect x="0" y="216.631" width="85.0394" height="42.5197" class="st1"/>
+ <text x="29.37" y="234.29" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Topic <tspan
+ x="17.63" dy="1.2em" class="st9">Consumer</tspan></text> </g>
+ <g id="shape31-86" v:mID="31" v:groupContext="shape" transform="translate(525.32,-222.06)">
+ <title>Sheet.31</title>
+ <path d="M0 259.15 L104.88 259.15" class="st15"/>
+ </g>
+ <g id="shape32-92" v:mID="32" v:groupContext="shape" transform="translate(525.32,-156.863)">
+ <title>Sheet.32</title>
+ <path d="M0 259.15 L104.88 259.15" class="st15"/>
+ </g>
+ <g id="shape33-97" v:mID="33" v:groupContext="shape" transform="translate(457.289,-156.863)">
+ <title>Sheet.33</title>
+ <path d="M0 259.15 L8.5 259.15" class="st16"/>
+ </g>
+ <g id="shape34-100" v:mID="34" v:groupContext="shape" transform="translate(616.029,-51.9812)">
+ <title>Rectangle.34</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <path d="M0 259.15 L113.39 259.15 L113.39 57.89 L0 57.89 L0 259.15 Z" class="st17"/>
+ </g>
+ <g id="shape35-102" v:mID="35" v:groupContext="shape" transform="translate(630.202,-63.3198)">
+ <title>Rectangle.35</title>
+ <desc>Direct Publisher</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="42.5197" cy="237.891" width="85.04" height="42.5197"/>
+ <rect x="0" y="216.631" width="85.0394" height="42.5197" class="st18"/>
+ <text x="27.83" y="234.29" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Direct<v:newlineChar/><tspan
+ x="19.79" dy="1.2em" class="st9">Publisher</tspan></text> </g>
+ <g id="shape36-106" v:mID="36" v:groupContext="shape" transform="translate(596.722,-24.9734)">
+ <title>Sheet.36</title>
+ <desc>Worker (e.g. compute)</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="76" cy="249.15" width="152" height="20"/>
+ <rect x="0" y="239.15" width="152" height="20" class="st13"/>
+ <text x="57.6" y="245.55" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Worker<v:newlineChar/><tspan
+ x="40.37" dy="1.2em" class="st9">(</tspan>e.g. compute)</text> </g>
+ <g id="group37-110" transform="translate(472.879,-60.4852)" v:mID="37" v:groupContext="group">
+ <v:custProps>
+ <v:cp v:nameU="ShapeClass" v:lbl="ShapeClass" v:type="0" v:invis="true" v:ask="false" v:langID="1033"
+ v:val="VT4(Equipment)"/>
+ <v:cp v:nameU="ShapeType" v:lbl="ShapeType" v:type="0" v:invis="true" v:ask="false" v:langID="1033"
+ v:val="VT4(Device)"/>
+ <v:cp v:nameU="SubShapeType" v:lbl="SubShapeType" v:type="0" v:invis="true" v:ask="false" v:langID="1033"
+ v:val="VT4(Switch)"/>
+ <v:cp v:nameU="Manufacturer" v:lbl="Manufacturer" v:type="0" v:sortKey="Equipment" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="ProductNumber" v:lbl="Product Number" v:type="0" v:sortKey="Equipment" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="PartNumber" v:lbl="Part Number" v:type="0" v:sortKey="Equipment" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="ProductDescription" v:lbl="Product Description" v:type="0" v:sortKey="Equipment" v:invis="false"
+ v:ask="false" v:langID="1033"/>
+ <v:cp v:nameU="AssetNumber" v:lbl="Asset Number" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="SerialNumber" v:lbl="Serial Number" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="Location" v:lbl="Location" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="Building" v:lbl="Building" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="Room" v:lbl="Room" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false" v:langID="1033"/>
+ <v:cp v:nameU="NetworkName" v:lbl="Network Name" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="IPAddress" v:lbl="IP Address" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="SubnetMask" v:lbl="Subnet Mask" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="AdminInterface" v:lbl="Administrative Interface" v:type="0" v:sortKey="Network" v:invis="false"
+ v:ask="false" v:langID="1033"/>
+ <v:cp v:nameU="NumberOfPorts" v:lbl="Number of Ports" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="MACAddress" v:lbl="MAC Address" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="CommunityString" v:lbl="Community String" v:type="0" v:sortKey="Network" v:invis="false"
+ v:ask="false" v:langID="1033"/>
+ <v:cp v:nameU="NetworkDescription" v:lbl="Network Description" v:type="0" v:sortKey="Network" v:invis="false"
+ v:ask="false" v:langID="1033"/>
+ </v:custProps>
+ <v:userDefs>
+ <v:ud v:nameU="HasText" v:val="VT0(1):5"/>
+ <v:ud v:nameU="ShapeClass" v:val="VT0(5):26"/>
+ <v:ud v:nameU="ShapeType" v:val="VT0(8):26"/>
+ <v:ud v:nameU="SubShapeType" v:val="VT0(66):26"/>
+ <v:ud v:nameU="visLegendShape" v:val="VT0(2):26"/>
+ <v:ud v:nameU="SolSH" v:val="VT14({BF0433D9-CD73-4EB5-8390-8653BE590246}):41"/>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <title>ATM switch.37</title>
+ <desc>name: msg_id (type: direct)</desc>
+ <g id="shape38-111" v:mID="38" v:groupContext="shape" transform="translate(-0.359055,0)">
+ <title>Sheet.38</title>
+ <path d="M28.35 259.15 L42.52 250.97 L42.52 218.82 L14.17 202.46 L0 210.64 L0 242.78 L28.35 259.15 Z" class="st2"/>
+ </g>
+ <g id="shape39-113" v:mID="39" v:groupContext="shape" transform="translate(28.1575,-0.0944882)">
+ <title>Sheet.39</title>
+ <path d="M0 227.01 L0 259.15 L14.17 250.97 L14.17 218.82 L0 227.01 Z" class="st3"/>
+ </g>
+ <g id="shape40-116" v:mID="40" v:groupContext="shape" transform="translate(-0.188976,-32.2386)">
+ <title>Sheet.40</title>
+ <path d="M0 242.78 L28.35 259.15 L42.52 250.97 L14.17 234.6 L0 242.78 Z" class="st4"/>
+ </g>
+ <g id="shape41-119" v:mID="41" v:groupContext="shape" transform="translate(-0.188976,-0.0944882)">
+ <title>Sheet.41</title>
+ <path d="M0 242.78 L28.35 259.15 L28.35 227.01 L0 210.64 L0 242.78 Z" class="st5"/>
+ </g>
+ <g id="shape42-122" v:mID="42" v:groupContext="shape" transform="translate(-0.188976,-0.0944882)">
+ <title>Sheet.42</title>
+ <path d="M0 210.64 L0 242.78 L28.35 259.15 L42.52 250.97 L42.52 218.82 L14.17 202.46 L0 210.64" class="st6"/>
+ </g>
+ <g id="shape43-125" v:mID="43" v:groupContext="shape" transform="translate(1.88976,-6.80315)">
+ <title>Sheet.43</title>
+ <path d="M4.05 223.81 L0 226.12 L4.05 233.09 L4.05 229.38 L7.09 231.13 L11.14 240.9 L7.09 245.98 L4.05 244.23 L4.05
+ 240.52 L0 242.82 L4.05 249.8 L4.05 246.09 A59.6713 55.5985 -178.23 0 0 8.1 248.42 L12.15 243.34 L16.2
+ 253.1 L20.25 255.44 L20.25 259.15 L24.3 256.85 L20.25 249.87 L20.25 253.58 L17.21 251.83 L13.16 242.07
+ L17.21 236.98 L20.25 238.73 L20.25 242.45 L24.3 240.14 L20.25 233.16 L20.25 236.88 L16.2 234.54 A89.6201
+ 83.5031 -177.36 0 0 12.15 239.63 L8.1 229.86 L4.05 227.53 L4.05 223.81 Z" class="st7"/>
+ </g>
+ <g id="shape37-127" v:mID="37" v:groupContext="groupContent">
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="21.2598" cy="277.552" width="79.22" height="36.8038"/>
+ <text x="-12.99" y="273.95" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>name: msg_id<v:newlineChar/><tspan
+ x="-10.36" dy="1.2em" class="st9">(</tspan>type: direct)</text> </g>
+ </g>
+ <g id="group44-130" transform="translate(298.549,-68.9891)" v:mID="44" v:groupContext="group">
+ <title>Sheet.44</title>
+ <g id="shape45-131" v:mID="45" v:groupContext="shape">
+ <title>Rectangle</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape46-133" v:mID="46" v:groupContext="shape" transform="translate(8.50394,-5.68434E-014)">
+ <title>Rectangle.10</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape47-135" v:mID="47" v:groupContext="shape" transform="translate(17.0079,-5.68434E-014)">
+ <title>Rectangle.11</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape48-137" v:mID="48" v:groupContext="shape" transform="translate(25.5118,-5.68434E-014)">
+ <title>Rectangle.12</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape49-139" v:mID="49" v:groupContext="shape" transform="translate(34.0157,-5.68434E-014)">
+ <title>Rectangle.13</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape50-141" v:mID="50" v:groupContext="shape" transform="translate(42.5197,-5.68434E-014)">
+ <title>Rectangle.14</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape51-143" v:mID="51" v:groupContext="shape" transform="translate(51.0236,-5.68434E-014)">
+ <title>Rectangle.15</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ </g>
+ <g id="shape52-145" v:mID="52" v:groupContext="shape" transform="translate(278.706,-54.8159)">
+ <title>Sheet.52</title>
+ <desc>key: msg_id</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="49.6063" cy="252.064" width="99.22" height="14.1732"/>
+ <rect x="0" y="244.977" width="99.2126" height="14.1732" class="st13"/>
+ <text x="20.73" y="255.66" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>key: msg_id</text> </g>
+ <g id="shape53-148" v:mID="53" v:groupContext="shape" transform="translate(358.076,-85.997)">
+ <title>Sheet.53</title>
+ <path d="M0 259.15 L97.91 259.15" class="st14"/>
+ </g>
+ <g id="shape54-153" v:mID="54" v:groupContext="shape" transform="translate(630.202,433.721) rotate(180)">
+ <title>Sheet.54</title>
+ <path d="M0 259.15 L104.88 259.15" class="st15"/>
+ </g>
+ <g id="shape55-158" v:mID="55" v:groupContext="shape" transform="translate(82.5801,-51.9812)">
+ <title>Rectangle.57</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <path d="M0 259.15 L113.39 259.15 L113.39 80.57 L0 80.57 L0 259.15 Z" class="st17"/>
+ </g>
+ <g id="shape56-160" v:mID="56" v:groupContext="shape" transform="translate(96.7534,-64.7371)">
+ <title>Rectangle.56</title>
+ <desc>Direct Consumer</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="42.5197" cy="237.891" width="85.04" height="42.5197"/>
+ <rect x="0" y="216.631" width="85.0394" height="42.5197" class="st18"/>
+ <text x="27.83" y="234.29" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Direct<v:newlineChar/><tspan
+ x="17.63" dy="1.2em" class="st9">Consumer</tspan></text> </g>
+ <g id="shape57-164" v:mID="57" v:groupContext="shape" transform="translate(63.273,-26.4694)">
+ <title>Sheet.57</title>
+ <desc>Invoker (e.g. api)</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="76" cy="249.15" width="152" height="20"/>
+ <rect x="0" y="239.15" width="152" height="20" class="st13"/>
+ <text x="57.66" y="245.55" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Invoker<v:newlineChar/><tspan
+ x="54.76" dy="1.2em" class="st9">(</tspan>e.g. api)</text> </g>
+ <g id="shape58-168" v:mID="58" v:groupContext="shape" transform="translate(96.7534,-175.288)">
+ <title>Rectangle.55</title>
+ <desc>Topic Publisher</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="42.5197" cy="237.891" width="85.04" height="42.5197"/>
+ <rect x="0" y="216.631" width="85.0394" height="42.5197" class="st18"/>
+ <text x="29.37" y="234.29" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Topic <v:newlineChar/><tspan
+ x="19.79" dy="1.2em" class="st9">Publisher</tspan></text> </g>
+ <g id="shape59-172" v:mID="59" v:groupContext="shape" transform="translate(181.793,-196.548)">
+ <title>Sheet.59</title>
+ <path d="M0 259.15 L113.92 259.15" class="st15"/>
+ </g>
+ <g id="shape60-177" v:mID="60" v:groupContext="shape" transform="translate(298.549,432.304) rotate(180)">
+ <title>Sheet.60</title>
+ <path d="M0 259.15 L116.76 259.15" class="st15"/>
+ </g>
+ <g id="shape61-182" v:mID="61" v:groupContext="shape" transform="translate(336.47,-0.80014)">
+ <title>Sheet.61</title>
+ <desc>RabbitMQ Node</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="76" cy="249.15" width="152" height="20"/>
+ <rect x="0" y="239.15" width="152" height="20" class="st13"/>
+ <text x="16.72" y="254.55" class="st19" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>RabbitMQ Node</text> </g>
+ <g id="shape62-185" v:mID="62" v:groupContext="shape" transform="translate(15.0841,-196.548)">
+ <title>Sheet.62</title>
+ <path d="M0 259.15 L36.71 259.15" class="st20"/>
+ </g>
+ <g id="shape64-191" v:mID="64" v:groupContext="shape" transform="translate(6.58013,-193.714)">
+ <title>Sheet.64</title>
+ <desc>rpc.call (topic.host)</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="34.0157" cy="240.646" width="68.04" height="37.0079"/>
+ <rect x="0" y="222.143" width="68.0315" height="37.0079" class="st13"/>
+ <text x="16.55" y="235.85" class="st8" v:langID="2057"><v:paragraph v:spLine="-0.8" v:horizAlign="1"/><v:tabList/>rpc.call<v:newlineChar/><tspan
+ x="5.95" dy="1.1em" class="st9">(</tspan>topic.host)</text> </g>
+ <g id="shape63-195" v:mID="63" v:groupContext="shape" transform="translate(224.848,-196.548)">
+ <title>Sheet.63</title>
+ <path d="M0 259.15 L36.71 259.15" class="st20"/>
+ </g>
+ <g id="shape66-200" v:mID="66" v:groupContext="shape" transform="translate(550.832,-84.5797)">
+ <title>Sheet.66</title>
+ <path d="M13.95 259.15 L14.31 259.15 L51.02 259.15" class="st22"/>
+ </g>
+ <g id="shape67-206" v:mID="67" v:groupContext="shape" transform="translate(224.848,-85.997)">
+ <title>Sheet.67</title>
+ <path d="M13.95 259.15 L14.31 259.15 L51.02 259.15" class="st22"/>
+ </g>
+ <g id="shape68-211" v:mID="68" v:groupContext="shape" transform="translate(550.832,-156.863)">
+ <title>Sheet.68</title>
+ <path d="M0 259.15 L36.71 259.15" class="st20"/>
+ </g>
+ </g>
+</svg>
diff --git a/doc/source/images/rabbit/flow2.png b/doc/source/images/rabbit/flow2.png Binary files differnew file mode 100644 index 000000000..19de2aafd --- /dev/null +++ b/doc/source/images/rabbit/flow2.png diff --git a/doc/source/images/rabbit/flow2.svg b/doc/source/images/rabbit/flow2.svg new file mode 100644 index 000000000..fe4cdf341 --- /dev/null +++ b/doc/source/images/rabbit/flow2.svg @@ -0,0 +1,423 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<!-- Generated by Microsoft Visio 11.0, SVG Export, v1.0 flow2.svg Page-1 -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"
+ xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="10.4093in" height="3.59931in"
+ viewBox="0 0 749.472 259.15" xml:space="preserve" color-interpolation-filters="sRGB" class="st22">
+ <v:documentProperties v:langID="2057" v:metric="true" v:viewMarkup="false"/>
+
+ <style type="text/css">
+ <![CDATA[
+ .st1 {fill:#e8eef7;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}
+ .st2 {fill:#ff00ff;fill-opacity:0;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0;stroke-width:0.72}
+ .st3 {fill:url(#grad31-9);stroke:#ffffff;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.72}
+ .st4 {fill:url(#grad30-15);stroke:#ffffff;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.72}
+ .st5 {fill:url(#grad32-19);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.72}
+ .st6 {stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st7 {fill:#ff0000;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}
+ .st8 {fill:#000000;font-family:Calibri;font-size:1.00001em}
+ .st9 {font-size:1em}
+ .st10 {fill:#ffffff;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}
+ .st11 {marker-start:url(#mrkr13-65);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st12 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.22935779816514}
+ .st13 {fill:none;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st14 {marker-end:url(#mrkr13-77);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st15 {marker-end:url(#mrkr1-91);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st16 {stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st17 {fill:none;stroke:#000000;stroke-dasharray:3.6,2.16;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}
+ .st18 {fill:#d8d8d8;stroke:#c00000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st19 {fill:#000000;font-family:Calibri;font-size:1.5em}
+ .st20 {marker-end:url(#mrkr13-129);stroke:#ff0000;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.25}
+ .st21 {fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-opacity:1;stroke-width:0.47169811320755}
+ .st22 {fill:none;fill-rule:evenodd;font-size:12;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
+ ]]>
+ </style>
+
+ <defs id="Patterns_And_Gradients">
+ <pattern id="grad31-9" v:fillPattern="31" v:foreground="#ffffff" v:background="#a7a7a7" x="0" y="0" width="1" height="1"
+ patternContentUnits="objectBoundingBox">
+ <path d="M 0 0 L 0 1 L 1 1 z" style="fill:url(#grad28-10)"/>
+ <path d="M 0 0 L 1 0 L 1 1 z" style="fill:url(#grad25-11)"/>
+ </pattern>
+ <linearGradient id="grad28-10" v:fillPattern="31" v:foreground="#ffffff" v:background="#a7a7a7" x1="0" y1="0" x2="0" y2="1">
+ <stop offset="0" style="stop-color:#ffffff;stop-opacity:1"/>
+ <stop offset="1" style="stop-color:#a7a7a7;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="grad25-11" v:fillPattern="31" v:foreground="#ffffff" v:background="#a7a7a7" x1="0" y1="0" x2="1" y2="0">
+ <stop offset="0" style="stop-color:#ffffff;stop-opacity:1"/>
+ <stop offset="1" style="stop-color:#a7a7a7;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="grad30-15" v:fillPattern="30" v:foreground="#ffffff" v:background="#dfdfdf" x1="0" y1="1" x2="0" y2="0">
+ <stop offset="0" style="stop-color:#ffffff;stop-opacity:1"/>
+ <stop offset="1" style="stop-color:#dfdfdf;stop-opacity:1"/>
+ </linearGradient>
+ <pattern id="grad32-19" v:fillPattern="32" v:foreground="#ffffff" v:background="#c0c0c0" x="0" y="0" width="1" height="1"
+ patternContentUnits="objectBoundingBox">
+ <path d="M 0 1 L 0 0 L 1 0 z" style="fill:url(#grad27-20)"/>
+ <path d="M 0 1 L 1 1 L 1 0 z" style="fill:url(#grad28-21)"/>
+ </pattern>
+ <linearGradient id="grad27-20" v:fillPattern="32" v:foreground="#ffffff" v:background="#c0c0c0" x1="1" y1="0" x2="0" y2="0">
+ <stop offset="0" style="stop-color:#ffffff;stop-opacity:1"/>
+ <stop offset="1" style="stop-color:#c0c0c0;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="grad28-21" v:fillPattern="32" v:foreground="#ffffff" v:background="#c0c0c0" x1="0" y1="0" x2="0" y2="1">
+ <stop offset="0" style="stop-color:#ffffff;stop-opacity:1"/>
+ <stop offset="1" style="stop-color:#c0c0c0;stop-opacity:1"/>
+ </linearGradient>
+ </defs>
+ <defs id="Markers">
+ <g id="lend13">
+ <path d="M 3 1 L 0 0 L 3 -1 L 3 1 " style="stroke:none"/>
+ </g>
+ <marker id="mrkr13-65" class="st12" v:arrowType="13" v:arrowSize="2" v:setback="12.6" refX="12.6" orient="auto"
+ markerUnits="strokeWidth">
+ <use xlink:href="#lend13" transform="scale(4.36) "/>
+ </marker>
+ <marker id="mrkr13-77" class="st12" v:arrowType="13" v:arrowSize="2" v:setback="13.08" refX="-13.08" orient="auto"
+ markerUnits="strokeWidth">
+ <use xlink:href="#lend13" transform="scale(-4.36,-4.36) "/>
+ </marker>
+ <g id="lend1">
+ <path d="M 1 -1 L 0 0 L 1 1 " style="stroke-linecap:round;stroke-linejoin:round;fill:none"/>
+ </g>
+ <marker id="mrkr1-91" class="st12" v:arrowType="1" v:arrowSize="2" orient="auto" markerUnits="strokeWidth">
+ <use xlink:href="#lend1" transform="scale(-4.36,-4.36) "/>
+ </marker>
+ <marker id="mrkr13-129" class="st21" v:arrowType="13" v:arrowSize="2" v:setback="6.36" refX="-6.36" orient="auto"
+ markerUnits="strokeWidth">
+ <use xlink:href="#lend13" transform="scale(-2.12,-2.12) "/>
+ </marker>
+ </defs>
+ <g v:mID="0" v:index="1" v:groupContext="foregroundPage">
+ <title>Page-1</title>
+ <v:pageProperties v:drawingScale="0.0393701" v:pageScale="0.0393701" v:drawingUnits="24" v:shadowOffsetX="8.50394"
+ v:shadowOffsetY="-8.50394"/>
+ <g id="shape1-1" v:mID="1" v:groupContext="shape" transform="translate(247.525,-23.6348)">
+ <title>Rounded rectangle</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <path d="M297.64 259.15 A14.1733 14.1733 -180 0 0 311.81 244.98 L311.81 38.05 A14.1733 14.1733 -180 0 0 297.64 23.87
+ L14.17 23.87 A14.1733 14.1733 -180 0 0 -0 38.05 L0 244.98 A14.1733 14.1733 -180 0 0 14.17 259.15 L297.64
+ 259.15 Z" class="st1"/>
+ </g>
+ <g id="group2-3" transform="translate(304.218,-162.532)" v:mID="2" v:groupContext="group">
+ <v:custProps>
+ <v:cp v:nameU="ShapeClass" v:lbl="ShapeClass" v:type="0" v:invis="true" v:ask="false" v:langID="1033"
+ v:val="VT4(Equipment)"/>
+ <v:cp v:nameU="ShapeType" v:lbl="ShapeType" v:type="0" v:invis="true" v:ask="false" v:langID="1033"
+ v:val="VT4(Device)"/>
+ <v:cp v:nameU="SubShapeType" v:lbl="SubShapeType" v:type="0" v:invis="true" v:ask="false" v:langID="1033"
+ v:val="VT4(Switch)"/>
+ <v:cp v:nameU="Manufacturer" v:lbl="Manufacturer" v:type="0" v:sortKey="Equipment" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="ProductNumber" v:lbl="Product Number" v:type="0" v:sortKey="Equipment" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="PartNumber" v:lbl="Part Number" v:type="0" v:sortKey="Equipment" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="ProductDescription" v:lbl="Product Description" v:type="0" v:sortKey="Equipment" v:invis="false"
+ v:ask="false" v:langID="1033"/>
+ <v:cp v:nameU="AssetNumber" v:lbl="Asset Number" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="SerialNumber" v:lbl="Serial Number" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="Location" v:lbl="Location" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="Building" v:lbl="Building" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="Room" v:lbl="Room" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false" v:langID="1033"/>
+ <v:cp v:nameU="NetworkName" v:lbl="Network Name" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="IPAddress" v:lbl="IP Address" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="SubnetMask" v:lbl="Subnet Mask" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="AdminInterface" v:lbl="Administrative Interface" v:type="0" v:sortKey="Network" v:invis="false"
+ v:ask="false" v:langID="1033"/>
+ <v:cp v:nameU="NumberOfPorts" v:lbl="Number of Ports" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="MACAddress" v:lbl="MAC Address" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="CommunityString" v:lbl="Community String" v:type="0" v:sortKey="Network" v:invis="false"
+ v:ask="false" v:langID="1033"/>
+ <v:cp v:nameU="NetworkDescription" v:lbl="Network Description" v:type="0" v:sortKey="Network" v:invis="false"
+ v:ask="false" v:langID="1033"/>
+ </v:custProps>
+ <v:userDefs>
+ <v:ud v:nameU="HasText" v:val="VT0(1):5"/>
+ <v:ud v:nameU="ShapeClass" v:val="VT0(5):26"/>
+ <v:ud v:nameU="ShapeType" v:val="VT0(8):26"/>
+ <v:ud v:nameU="SubShapeType" v:val="VT0(66):26"/>
+ <v:ud v:nameU="visLegendShape" v:val="VT0(2):26"/>
+ <v:ud v:nameU="SolSH" v:val="VT14({BF0433D9-CD73-4EB5-8390-8653BE590246}):41"/>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <title>ATM switch</title>
+ <desc>name: control_exchange (type: topic)</desc>
+ <g id="shape3-4" v:mID="3" v:groupContext="shape" transform="translate(-0.359055,0)">
+ <title>Sheet.3</title>
+ <path d="M28.35 259.15 L42.52 250.97 L42.52 218.82 L14.17 202.46 L0 210.64 L0 242.78 L28.35 259.15 Z" class="st2"/>
+ </g>
+ <g id="shape4-6" v:mID="4" v:groupContext="shape" transform="translate(28.1575,-0.0944882)">
+ <title>Sheet.4</title>
+ <path d="M0 227.01 L0 259.15 L14.17 250.97 L14.17 218.82 L0 227.01 Z" class="st3"/>
+ </g>
+ <g id="shape5-12" v:mID="5" v:groupContext="shape" transform="translate(-0.188976,-32.2386)">
+ <title>Sheet.5</title>
+ <path d="M0 242.78 L28.35 259.15 L42.52 250.97 L14.17 234.6 L0 242.78 Z" class="st4"/>
+ </g>
+ <g id="shape6-16" v:mID="6" v:groupContext="shape" transform="translate(-0.188976,-0.0944882)">
+ <title>Sheet.6</title>
+ <path d="M0 242.78 L28.35 259.15 L28.35 227.01 L0 210.64 L0 242.78 Z" class="st5"/>
+ </g>
+ <g id="shape7-22" v:mID="7" v:groupContext="shape" transform="translate(-0.188976,-0.0944882)">
+ <title>Sheet.7</title>
+ <path d="M0 210.64 L0 242.78 L28.35 259.15 L42.52 250.97 L42.52 218.82 L14.17 202.46 L0 210.64" class="st6"/>
+ </g>
+ <g id="shape8-25" v:mID="8" v:groupContext="shape" transform="translate(1.88976,-6.80315)">
+ <title>Sheet.8</title>
+ <path d="M4.05 223.81 L0 226.12 L4.05 233.09 L4.05 229.38 L7.09 231.13 L11.14 240.9 L7.09 245.98 L4.05 244.23 L4.05
+ 240.52 L0 242.82 L4.05 249.8 L4.05 246.09 A59.6713 55.5985 -178.23 0 0 8.1 248.42 L12.15 243.34 L16.2
+ 253.1 L20.25 255.44 L20.25 259.15 L24.3 256.85 L20.25 249.87 L20.25 253.58 L17.21 251.83 L13.16 242.07
+ L17.21 236.98 L20.25 238.73 L20.25 242.45 L24.3 240.14 L20.25 233.16 L20.25 236.88 L16.2 234.54 A89.6201
+ 83.5031 -177.36 0 0 12.15 239.63 L8.1 229.86 L4.05 227.53 L4.05 223.81 Z" class="st7"/>
+ </g>
+ <g id="shape2-27" v:mID="2" v:groupContext="groupContent">
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="21.2598" cy="277.552" width="131.44" height="36.8038"/>
+ <text x="-39.1" y="273.95" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>name: control_exchange<v:newlineChar/><tspan
+ x="-8.44" dy="1.2em" class="st9">(</tspan>type: topic)</text> </g>
+ </g>
+ <g id="group9-30" transform="translate(465.793,-205.052)" v:mID="9" v:groupContext="group">
+ <title>Sheet.9</title>
+ <g id="shape10-31" v:mID="10" v:groupContext="shape">
+ <title>Rectangle</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape11-33" v:mID="11" v:groupContext="shape" transform="translate(8.50394,-5.68434E-014)">
+ <title>Rectangle.10</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape12-35" v:mID="12" v:groupContext="shape" transform="translate(17.0079,-5.68434E-014)">
+ <title>Rectangle.11</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape13-37" v:mID="13" v:groupContext="shape" transform="translate(25.5118,-5.68434E-014)">
+ <title>Rectangle.12</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape14-39" v:mID="14" v:groupContext="shape" transform="translate(34.0157,-5.68434E-014)">
+ <title>Rectangle.13</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape15-41" v:mID="15" v:groupContext="shape" transform="translate(42.5197,-5.68434E-014)">
+ <title>Rectangle.14</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape16-43" v:mID="16" v:groupContext="shape" transform="translate(51.0236,-5.68434E-014)">
+ <title>Rectangle.15</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ </g>
+ <g id="group17-45" transform="translate(465.793,-139.855)" v:mID="17" v:groupContext="group">
+ <title>Sheet.17</title>
+ <g id="shape18-46" v:mID="18" v:groupContext="shape">
+ <title>Rectangle</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape19-48" v:mID="19" v:groupContext="shape" transform="translate(8.50394,-5.68434E-014)">
+ <title>Rectangle.10</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape20-50" v:mID="20" v:groupContext="shape" transform="translate(17.0079,-5.68434E-014)">
+ <title>Rectangle.11</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape21-52" v:mID="21" v:groupContext="shape" transform="translate(25.5118,-5.68434E-014)">
+ <title>Rectangle.12</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape22-54" v:mID="22" v:groupContext="shape" transform="translate(34.0157,-5.68434E-014)">
+ <title>Rectangle.13</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape23-56" v:mID="23" v:groupContext="shape" transform="translate(42.5197,-5.68434E-014)">
+ <title>Rectangle.14</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape24-58" v:mID="24" v:groupContext="shape" transform="translate(51.0236,-5.68434E-014)">
+ <title>Rectangle.15</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="225.135" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ </g>
+ <g id="shape25-60" v:mID="25" v:groupContext="shape" transform="translate(360.911,-193.714)">
+ <title>Sheet.25</title>
+ <path d="M9.45 259.15 L9.81 259.15 L56.69 259.15 L56.69 230.8 L96.38 230.8 L104.88 230.8" class="st11"/>
+ </g>
+ <g id="shape26-66" v:mID="26" v:groupContext="shape" transform="translate(445.95,-189.462)">
+ <title>Sheet.26</title>
+ <desc>key: topic</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="49.6063" cy="252.064" width="99.22" height="14.1732"/>
+ <rect x="0" y="244.977" width="99.2126" height="14.1732" class="st13"/>
+ <text x="25.98" y="255.66" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>key: topic</text> </g>
+ <g id="shape27-69" v:mID="27" v:groupContext="shape" transform="translate(454.454,-119.855)">
+ <title>Sheet.27</title>
+ <desc>key: topic.host</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="41.1024" cy="249.15" width="82.21" height="20"/>
+ <rect x="0" y="239.15" width="82.2047" height="20" class="st13"/>
+ <text x="5.28" y="252.75" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>key: topic.host</text> </g>
+ <g id="shape28-72" v:mID="28" v:groupContext="shape" transform="translate(360.911,-156.863)">
+ <title>Sheet.28</title>
+ <path d="M96.38 259.15 L56.69 259.15 L56.69 230.8 L9.81 230.8" class="st14"/>
+ </g>
+ <g id="shape29-78" v:mID="29" v:groupContext="shape" transform="translate(630.202,-200.8)">
+ <title>Rectangle</title>
+ <desc>Topic Consumer</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="42.5197" cy="237.891" width="85.04" height="42.5197"/>
+ <rect x="0" y="216.631" width="85.0394" height="42.5197" class="st1"/>
+ <text x="29.37" y="234.29" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Topic <tspan
+ x="17.63" dy="1.2em" class="st9">Consumer</tspan></text> </g>
+ <g id="shape30-82" v:mID="30" v:groupContext="shape" transform="translate(630.202,-135.603)">
+ <title>Rectangle.30</title>
+ <desc>Topic Consumer</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="42.5197" cy="237.891" width="85.04" height="42.5197"/>
+ <rect x="0" y="216.631" width="85.0394" height="42.5197" class="st1"/>
+ <text x="29.37" y="234.29" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Topic <tspan
+ x="17.63" dy="1.2em" class="st9">Consumer</tspan></text> </g>
+ <g id="shape31-86" v:mID="31" v:groupContext="shape" transform="translate(525.32,-222.06)">
+ <title>Sheet.31</title>
+ <path d="M0 259.15 L104.88 259.15" class="st15"/>
+ </g>
+ <g id="shape32-92" v:mID="32" v:groupContext="shape" transform="translate(525.32,-156.863)">
+ <title>Sheet.32</title>
+ <path d="M0 259.15 L104.88 259.15" class="st15"/>
+ </g>
+ <g id="shape33-97" v:mID="33" v:groupContext="shape" transform="translate(457.289,-156.863)">
+ <title>Sheet.33</title>
+ <path d="M0 259.15 L8.5 259.15" class="st16"/>
+ </g>
+ <g id="shape34-100" v:mID="34" v:groupContext="shape" transform="translate(616.029,-51.9812)">
+ <title>Rectangle.34</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <path d="M0 259.15 L113.39 259.15 L113.39 57.89 L0 57.89 L0 259.15 Z" class="st17"/>
+ </g>
+ <g id="shape36-102" v:mID="36" v:groupContext="shape" transform="translate(596.722,-24.9734)">
+ <title>Sheet.36</title>
+ <desc>Worker (e.g. compute)</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="76" cy="249.15" width="152" height="20"/>
+ <rect x="0" y="239.15" width="152" height="20" class="st13"/>
+ <text x="57.6" y="245.55" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Worker<v:newlineChar/><tspan
+ x="40.37" dy="1.2em" class="st9">(</tspan>e.g. compute)</text> </g>
+ <g id="shape55-106" v:mID="55" v:groupContext="shape" transform="translate(82.5801,-51.9812)">
+ <title>Rectangle.57</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <path d="M0 259.15 L113.39 259.15 L113.39 80.57 L0 80.57 L0 259.15 Z" class="st17"/>
+ </g>
+ <g id="shape57-108" v:mID="57" v:groupContext="shape" transform="translate(63.273,-26.4694)">
+ <title>Sheet.57</title>
+ <desc>Invoker (e.g. api)</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="76" cy="249.15" width="152" height="20"/>
+ <rect x="0" y="239.15" width="152" height="20" class="st13"/>
+ <text x="57.66" y="245.55" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Invoker<v:newlineChar/><tspan
+ x="54.76" dy="1.2em" class="st9">(</tspan>e.g. api)</text> </g>
+ <g id="shape58-112" v:mID="58" v:groupContext="shape" transform="translate(96.7534,-175.288)">
+ <title>Rectangle.55</title>
+ <desc>Topic Publisher</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="42.5197" cy="237.891" width="85.04" height="42.5197"/>
+ <rect x="0" y="216.631" width="85.0394" height="42.5197" class="st18"/>
+ <text x="29.37" y="234.29" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Topic <v:newlineChar/><tspan
+ x="19.79" dy="1.2em" class="st9">Publisher</tspan></text> </g>
+ <g id="shape59-116" v:mID="59" v:groupContext="shape" transform="translate(181.793,-196.548)">
+ <title>Sheet.59</title>
+ <path d="M0 259.15 L113.92 259.15" class="st15"/>
+ </g>
+ <g id="shape61-121" v:mID="61" v:groupContext="shape" transform="translate(336.47,-0.80014)">
+ <title>Sheet.61</title>
+ <desc>RabbitMQ Node</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="76" cy="249.15" width="152" height="20"/>
+ <rect x="0" y="239.15" width="152" height="20" class="st13"/>
+ <text x="16.72" y="254.55" class="st19" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>RabbitMQ Node</text> </g>
+ <g id="shape62-124" v:mID="62" v:groupContext="shape" transform="translate(15.0841,-196.548)">
+ <title>Sheet.62</title>
+ <path d="M0 259.15 L36.71 259.15" class="st20"/>
+ </g>
+ <g id="shape63-130" v:mID="63" v:groupContext="shape" transform="translate(3.74548,-199.225)">
+ <title>Sheet.63</title>
+ <desc>rpc.cast(topic)</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="39.685" cy="249.15" width="79.38" height="20"/>
+ <rect x="0" y="239.15" width="79.3701" height="20" class="st13"/>
+ <text x="4.74" y="254.55" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>rpc.cast(topic)</text> </g>
+ <g id="shape64-133" v:mID="64" v:groupContext="shape" transform="translate(224.848,-196.548)">
+ <title>Sheet.64</title>
+ <path d="M0 259.15 L36.71 259.15" class="st20"/>
+ </g>
+ <g id="shape65-138" v:mID="65" v:groupContext="shape" transform="translate(550.832,-222.06)">
+ <title>Sheet.65</title>
+ <path d="M0 259.15 L36.71 259.15" class="st20"/>
+ </g>
+ </g>
+</svg>
diff --git a/doc/source/images/rabbit/rabt.png b/doc/source/images/rabbit/rabt.png Binary files differnew file mode 100644 index 000000000..e3923b9a7 --- /dev/null +++ b/doc/source/images/rabbit/rabt.png diff --git a/doc/source/images/rabbit/rabt.svg b/doc/source/images/rabbit/rabt.svg new file mode 100644 index 000000000..142a33ce0 --- /dev/null +++ b/doc/source/images/rabbit/rabt.svg @@ -0,0 +1,581 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<!-- Generated by Microsoft Visio 11.0, SVG Export, v1.0 rabt.svg Page-1 -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"
+ xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="9.54096in" height="3.88601in"
+ viewBox="0 0 686.949 279.793" xml:space="preserve" color-interpolation-filters="sRGB" class="st21">
+ <v:documentProperties v:langID="2057" v:metric="true" v:viewMarkup="false"/>
+
+ <style type="text/css">
+ <![CDATA[
+ .st1 {fill:#e8eef7;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}
+ .st2 {fill:#ff00ff;fill-opacity:0;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0;stroke-width:0.72}
+ .st3 {fill:url(#grad31-9);stroke:#ffffff;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.72}
+ .st4 {fill:url(#grad30-15);stroke:#ffffff;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.72}
+ .st5 {fill:url(#grad32-19);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.72}
+ .st6 {stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st7 {fill:#ff0000;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}
+ .st8 {fill:#000000;font-family:Calibri;font-size:1.00001em}
+ .st9 {font-size:1em}
+ .st10 {fill:#ffffff;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}
+ .st11 {marker-start:url(#mrkr13-65);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st12 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.22935779816514}
+ .st13 {fill:none;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st14 {marker-end:url(#mrkr13-77);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st15 {marker-end:url(#mrkr1-91);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st16 {stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+ .st17 {fill:none;stroke:#000000;stroke-dasharray:3.6,2.16;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.24}
+ .st18 {fill:#d8d8d8;stroke:#c00000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st19 {fill:#000000;font-family:Calibri;font-size:1.5em}
+ .st20 {font-size:0.666672em}
+ .st21 {fill:none;fill-rule:evenodd;font-size:12;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
+ ]]>
+ </style>
+
+ <defs id="Patterns_And_Gradients">
+ <pattern id="grad31-9" v:fillPattern="31" v:foreground="#ffffff" v:background="#a7a7a7" x="0" y="0" width="1" height="1"
+ patternContentUnits="objectBoundingBox">
+ <path d="M 0 0 L 0 1 L 1 1 z" style="fill:url(#grad28-10)"/>
+ <path d="M 0 0 L 1 0 L 1 1 z" style="fill:url(#grad25-11)"/>
+ </pattern>
+ <linearGradient id="grad28-10" v:fillPattern="31" v:foreground="#ffffff" v:background="#a7a7a7" x1="0" y1="0" x2="0" y2="1">
+ <stop offset="0" style="stop-color:#ffffff;stop-opacity:1"/>
+ <stop offset="1" style="stop-color:#a7a7a7;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="grad25-11" v:fillPattern="31" v:foreground="#ffffff" v:background="#a7a7a7" x1="0" y1="0" x2="1" y2="0">
+ <stop offset="0" style="stop-color:#ffffff;stop-opacity:1"/>
+ <stop offset="1" style="stop-color:#a7a7a7;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="grad30-15" v:fillPattern="30" v:foreground="#ffffff" v:background="#dfdfdf" x1="0" y1="1" x2="0" y2="0">
+ <stop offset="0" style="stop-color:#ffffff;stop-opacity:1"/>
+ <stop offset="1" style="stop-color:#dfdfdf;stop-opacity:1"/>
+ </linearGradient>
+ <pattern id="grad32-19" v:fillPattern="32" v:foreground="#ffffff" v:background="#c0c0c0" x="0" y="0" width="1" height="1"
+ patternContentUnits="objectBoundingBox">
+ <path d="M 0 1 L 0 0 L 1 0 z" style="fill:url(#grad27-20)"/>
+ <path d="M 0 1 L 1 1 L 1 0 z" style="fill:url(#grad28-21)"/>
+ </pattern>
+ <linearGradient id="grad27-20" v:fillPattern="32" v:foreground="#ffffff" v:background="#c0c0c0" x1="1" y1="0" x2="0" y2="0">
+ <stop offset="0" style="stop-color:#ffffff;stop-opacity:1"/>
+ <stop offset="1" style="stop-color:#c0c0c0;stop-opacity:1"/>
+ </linearGradient>
+ <linearGradient id="grad28-21" v:fillPattern="32" v:foreground="#ffffff" v:background="#c0c0c0" x1="0" y1="0" x2="0" y2="1">
+ <stop offset="0" style="stop-color:#ffffff;stop-opacity:1"/>
+ <stop offset="1" style="stop-color:#c0c0c0;stop-opacity:1"/>
+ </linearGradient>
+ </defs>
+ <defs id="Markers">
+ <g id="lend13">
+ <path d="M 3 1 L 0 0 L 3 -1 L 3 1 " style="stroke:none"/>
+ </g>
+ <marker id="mrkr13-65" class="st12" v:arrowType="13" v:arrowSize="2" v:setback="12.6" refX="12.6" orient="auto"
+ markerUnits="strokeWidth">
+ <use xlink:href="#lend13" transform="scale(4.36) "/>
+ </marker>
+ <marker id="mrkr13-77" class="st12" v:arrowType="13" v:arrowSize="2" v:setback="13.08" refX="-13.08" orient="auto"
+ markerUnits="strokeWidth">
+ <use xlink:href="#lend13" transform="scale(-4.36,-4.36) "/>
+ </marker>
+ <g id="lend1">
+ <path d="M 1 -1 L 0 0 L 1 1 " style="stroke-linecap:round;stroke-linejoin:round;fill:none"/>
+ </g>
+ <marker id="mrkr1-91" class="st12" v:arrowType="1" v:arrowSize="2" orient="auto" markerUnits="strokeWidth">
+ <use xlink:href="#lend1" transform="scale(-4.36,-4.36) "/>
+ </marker>
+ </defs>
+ <g v:mID="0" v:index="1" v:groupContext="foregroundPage">
+ <title>Page-1</title>
+ <v:pageProperties v:drawingScale="0.0393701" v:pageScale="0.0393701" v:drawingUnits="24" v:shadowOffsetX="8.50394"
+ v:shadowOffsetY="-8.50394"/>
+ <g id="shape1-1" v:mID="1" v:groupContext="shape" transform="translate(185.002,-44.2771)">
+ <title>Rounded rectangle</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <path d="M297.64 279.79 A14.1733 14.1733 -180 0 0 311.81 265.62 L311.81 58.69 A14.1733 14.1733 -180 0 0 297.64 44.52
+ L14.17 44.52 A14.1733 14.1733 -180 0 0 -0 58.69 L0 265.62 A14.1733 14.1733 -180 0 0 14.17 279.79 L297.64
+ 279.79 Z" class="st1"/>
+ </g>
+ <g id="group2-3" transform="translate(241.695,-183.175)" v:mID="2" v:groupContext="group">
+ <v:custProps>
+ <v:cp v:nameU="ShapeClass" v:lbl="ShapeClass" v:type="0" v:invis="true" v:ask="false" v:langID="1033"
+ v:val="VT4(Equipment)"/>
+ <v:cp v:nameU="ShapeType" v:lbl="ShapeType" v:type="0" v:invis="true" v:ask="false" v:langID="1033"
+ v:val="VT4(Device)"/>
+ <v:cp v:nameU="SubShapeType" v:lbl="SubShapeType" v:type="0" v:invis="true" v:ask="false" v:langID="1033"
+ v:val="VT4(Switch)"/>
+ <v:cp v:nameU="Manufacturer" v:lbl="Manufacturer" v:type="0" v:sortKey="Equipment" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="ProductNumber" v:lbl="Product Number" v:type="0" v:sortKey="Equipment" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="PartNumber" v:lbl="Part Number" v:type="0" v:sortKey="Equipment" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="ProductDescription" v:lbl="Product Description" v:type="0" v:sortKey="Equipment" v:invis="false"
+ v:ask="false" v:langID="1033"/>
+ <v:cp v:nameU="AssetNumber" v:lbl="Asset Number" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="SerialNumber" v:lbl="Serial Number" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="Location" v:lbl="Location" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="Building" v:lbl="Building" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="Room" v:lbl="Room" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false" v:langID="1033"/>
+ <v:cp v:nameU="NetworkName" v:lbl="Network Name" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="IPAddress" v:lbl="IP Address" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="SubnetMask" v:lbl="Subnet Mask" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="AdminInterface" v:lbl="Administrative Interface" v:type="0" v:sortKey="Network" v:invis="false"
+ v:ask="false" v:langID="1033"/>
+ <v:cp v:nameU="NumberOfPorts" v:lbl="Number of Ports" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="MACAddress" v:lbl="MAC Address" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="CommunityString" v:lbl="Community String" v:type="0" v:sortKey="Network" v:invis="false"
+ v:ask="false" v:langID="1033"/>
+ <v:cp v:nameU="NetworkDescription" v:lbl="Network Description" v:type="0" v:sortKey="Network" v:invis="false"
+ v:ask="false" v:langID="1033"/>
+ </v:custProps>
+ <v:userDefs>
+ <v:ud v:nameU="HasText" v:val="VT0(1):5"/>
+ <v:ud v:nameU="ShapeClass" v:val="VT0(5):26"/>
+ <v:ud v:nameU="ShapeType" v:val="VT0(8):26"/>
+ <v:ud v:nameU="SubShapeType" v:val="VT0(66):26"/>
+ <v:ud v:nameU="visLegendShape" v:val="VT0(2):26"/>
+ <v:ud v:nameU="SolSH" v:val="VT14({BF0433D9-CD73-4EB5-8390-8653BE590246}):41"/>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <title>ATM switch</title>
+ <desc>name: control_exchange (type: topic)</desc>
+ <g id="shape3-4" v:mID="3" v:groupContext="shape" transform="translate(-0.359055,0)">
+ <title>Sheet.3</title>
+ <path d="M28.35 279.79 L42.52 271.61 L42.52 239.47 L14.17 223.1 L0 231.28 L0 263.43 L28.35 279.79 Z" class="st2"/>
+ </g>
+ <g id="shape4-6" v:mID="4" v:groupContext="shape" transform="translate(28.1575,-0.0944882)">
+ <title>Sheet.4</title>
+ <path d="M0 247.65 L0 279.79 L14.17 271.61 L14.17 239.47 L0 247.65 Z" class="st3"/>
+ </g>
+ <g id="shape5-12" v:mID="5" v:groupContext="shape" transform="translate(-0.188976,-32.2386)">
+ <title>Sheet.5</title>
+ <path d="M0 263.43 L28.35 279.79 L42.52 271.61 L14.17 255.24 L0 263.43 Z" class="st4"/>
+ </g>
+ <g id="shape6-16" v:mID="6" v:groupContext="shape" transform="translate(-0.188976,-0.0944882)">
+ <title>Sheet.6</title>
+ <path d="M0 263.43 L28.35 279.79 L28.35 247.65 L0 231.28 L0 263.43 Z" class="st5"/>
+ </g>
+ <g id="shape7-22" v:mID="7" v:groupContext="shape" transform="translate(-0.188976,-0.0944882)">
+ <title>Sheet.7</title>
+ <path d="M0 231.28 L0 263.43 L28.35 279.79 L42.52 271.61 L42.52 239.47 L14.17 223.1 L0 231.28" class="st6"/>
+ </g>
+ <g id="shape8-25" v:mID="8" v:groupContext="shape" transform="translate(1.88976,-6.80315)">
+ <title>Sheet.8</title>
+ <path d="M4.05 244.46 L0 246.76 L4.05 253.74 L4.05 250.02 L7.09 251.78 L11.14 261.54 L7.09 266.63 L4.05 264.87 L4.05
+ 261.16 L0 263.46 L4.05 270.44 L4.05 266.73 A59.6713 55.5985 -178.23 0 0 8.1 269.07 L12.15 263.98 L16.2
+ 273.74 L20.25 276.08 L20.25 279.79 L24.3 277.49 L20.25 270.51 L20.25 274.22 L17.21 272.47 L13.16 262.71
+ L17.21 257.62 L20.25 259.38 L20.25 263.09 L24.3 260.79 L20.25 253.81 L20.25 257.52 L16.2 255.18 A89.6201
+ 83.5031 -177.36 0 0 12.15 260.27 L8.1 250.51 L4.05 248.17 L4.05 244.46 Z" class="st7"/>
+ </g>
+ <g id="shape2-27" v:mID="2" v:groupContext="groupContent">
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="21.2598" cy="298.195" width="131.44" height="36.8038"/>
+ <text x="-39.1" y="294.59" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>name: control_exchange<v:newlineChar/><tspan
+ x="-8.44" dy="1.2em" class="st9">(</tspan>type: topic)</text> </g>
+ </g>
+ <g id="group17-30" transform="translate(403.27,-225.694)" v:mID="17" v:groupContext="group">
+ <title>Sheet.17</title>
+ <g id="shape18-31" v:mID="18" v:groupContext="shape">
+ <title>Rectangle</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="245.777" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape19-33" v:mID="19" v:groupContext="shape" transform="translate(8.50394,-5.68434E-014)">
+ <title>Rectangle.10</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="245.777" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape20-35" v:mID="20" v:groupContext="shape" transform="translate(17.0079,-5.68434E-014)">
+ <title>Rectangle.11</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="245.777" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape21-37" v:mID="21" v:groupContext="shape" transform="translate(25.5118,-5.68434E-014)">
+ <title>Rectangle.12</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="245.777" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape22-39" v:mID="22" v:groupContext="shape" transform="translate(34.0157,-5.68434E-014)">
+ <title>Rectangle.13</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="245.777" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape23-41" v:mID="23" v:groupContext="shape" transform="translate(42.5197,-5.68434E-014)">
+ <title>Rectangle.14</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="245.777" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape24-43" v:mID="24" v:groupContext="shape" transform="translate(51.0236,-5.68434E-014)">
+ <title>Rectangle.15</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="245.777" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ </g>
+ <g id="group9-45" transform="translate(403.27,-160.498)" v:mID="9" v:groupContext="group">
+ <title>Sheet.9</title>
+ <g id="shape10-46" v:mID="10" v:groupContext="shape">
+ <title>Rectangle</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="245.777" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape11-48" v:mID="11" v:groupContext="shape" transform="translate(8.50394,-5.68434E-014)">
+ <title>Rectangle.10</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="245.777" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape12-50" v:mID="12" v:groupContext="shape" transform="translate(17.0079,-5.68434E-014)">
+ <title>Rectangle.11</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="245.777" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape13-52" v:mID="13" v:groupContext="shape" transform="translate(25.5118,-5.68434E-014)">
+ <title>Rectangle.12</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="245.777" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape14-54" v:mID="14" v:groupContext="shape" transform="translate(34.0157,-5.68434E-014)">
+ <title>Rectangle.13</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="245.777" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape15-56" v:mID="15" v:groupContext="shape" transform="translate(42.5197,-5.68434E-014)">
+ <title>Rectangle.14</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="245.777" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape16-58" v:mID="16" v:groupContext="shape" transform="translate(51.0236,-5.68434E-014)">
+ <title>Rectangle.15</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="245.777" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ </g>
+ <g id="shape25-60" v:mID="25" v:groupContext="shape" transform="translate(298.388,-214.356)">
+ <title>Sheet.25</title>
+ <path d="M9.45 279.79 L9.81 279.79 L56.69 279.79 L56.69 251.45 L96.38 251.45 L104.88 251.45" class="st11"/>
+ </g>
+ <g id="shape27-66" v:mID="27" v:groupContext="shape" transform="translate(383.427,-210.104)">
+ <title>Sheet.27</title>
+ <desc>key: topic</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="49.6063" cy="272.706" width="99.22" height="14.1732"/>
+ <rect x="0" y="265.62" width="99.2126" height="14.1732" class="st13"/>
+ <text x="25.98" y="276.31" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>key: topic</text> </g>
+ <g id="shape28-69" v:mID="28" v:groupContext="shape" transform="translate(391.931,-140.498)">
+ <title>Sheet.28</title>
+ <desc>key: topic.host</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="41.1024" cy="269.793" width="82.21" height="20"/>
+ <rect x="0" y="259.793" width="82.2047" height="20" class="st13"/>
+ <text x="5.28" y="273.39" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>key: topic.host</text> </g>
+ <g id="shape26-72" v:mID="26" v:groupContext="shape" transform="translate(298.388,-177.505)">
+ <title>Sheet.26</title>
+ <path d="M96.38 279.79 L56.69 279.79 L56.69 251.45 L9.81 251.45" class="st14"/>
+ </g>
+ <g id="shape29-78" v:mID="29" v:groupContext="shape" transform="translate(567.679,-221.442)">
+ <title>Rectangle</title>
+ <desc>Topic Consumer</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="42.5197" cy="258.533" width="85.04" height="42.5197"/>
+ <rect x="0" y="237.273" width="85.0394" height="42.5197" class="st1"/>
+ <text x="29.37" y="254.93" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Topic <tspan
+ x="17.63" dy="1.2em" class="st9">Consumer</tspan></text> </g>
+ <g id="shape30-82" v:mID="30" v:groupContext="shape" transform="translate(567.679,-156.246)">
+ <title>Rectangle.30</title>
+ <desc>Topic Consumer</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="42.5197" cy="258.533" width="85.04" height="42.5197"/>
+ <rect x="0" y="237.273" width="85.0394" height="42.5197" class="st1"/>
+ <text x="29.37" y="254.93" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Topic <tspan
+ x="17.63" dy="1.2em" class="st9">Consumer</tspan></text> </g>
+ <g id="shape31-86" v:mID="31" v:groupContext="shape" transform="translate(462.797,-242.702)">
+ <title>Sheet.31</title>
+ <path d="M0 279.79 L104.88 279.79" class="st15"/>
+ </g>
+ <g id="shape32-92" v:mID="32" v:groupContext="shape" transform="translate(462.797,-177.505)">
+ <title>Sheet.32</title>
+ <path d="M0 279.79 L104.88 279.79" class="st15"/>
+ </g>
+ <g id="shape33-97" v:mID="33" v:groupContext="shape" transform="translate(394.766,-177.505)">
+ <title>Sheet.33</title>
+ <path d="M0 279.79 L8.5 279.79" class="st16"/>
+ </g>
+ <g id="shape34-100" v:mID="34" v:groupContext="shape" transform="translate(553.506,-72.6236)">
+ <title>Rectangle.34</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <path d="M0 279.79 L113.39 279.79 L113.39 78.53 L0 78.53 L0 279.79 Z" class="st17"/>
+ </g>
+ <g id="shape35-102" v:mID="35" v:groupContext="shape" transform="translate(567.679,-83.9622)">
+ <title>Rectangle.35</title>
+ <desc>Direct Publisher</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="42.5197" cy="258.533" width="85.04" height="42.5197"/>
+ <rect x="0" y="237.273" width="85.0394" height="42.5197" class="st18"/>
+ <text x="27.83" y="254.93" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Direct<v:newlineChar/><tspan
+ x="19.79" dy="1.2em" class="st9">Publisher</tspan></text> </g>
+ <g id="shape36-106" v:mID="36" v:groupContext="shape" transform="translate(534.199,-45.6157)">
+ <title>Sheet.36</title>
+ <desc>Worker (e.g. compute)</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="76" cy="269.793" width="152" height="20"/>
+ <rect x="0" y="259.793" width="152" height="20" class="st13"/>
+ <text x="57.6" y="266.19" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Worker<v:newlineChar/><tspan
+ x="40.37" dy="1.2em" class="st9">(</tspan>e.g. compute)</text> </g>
+ <g id="group37-110" transform="translate(410.356,-81.1275)" v:mID="37" v:groupContext="group">
+ <v:custProps>
+ <v:cp v:nameU="ShapeClass" v:lbl="ShapeClass" v:type="0" v:invis="true" v:ask="false" v:langID="1033"
+ v:val="VT4(Equipment)"/>
+ <v:cp v:nameU="ShapeType" v:lbl="ShapeType" v:type="0" v:invis="true" v:ask="false" v:langID="1033"
+ v:val="VT4(Device)"/>
+ <v:cp v:nameU="SubShapeType" v:lbl="SubShapeType" v:type="0" v:invis="true" v:ask="false" v:langID="1033"
+ v:val="VT4(Switch)"/>
+ <v:cp v:nameU="Manufacturer" v:lbl="Manufacturer" v:type="0" v:sortKey="Equipment" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="ProductNumber" v:lbl="Product Number" v:type="0" v:sortKey="Equipment" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="PartNumber" v:lbl="Part Number" v:type="0" v:sortKey="Equipment" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="ProductDescription" v:lbl="Product Description" v:type="0" v:sortKey="Equipment" v:invis="false"
+ v:ask="false" v:langID="1033"/>
+ <v:cp v:nameU="AssetNumber" v:lbl="Asset Number" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="SerialNumber" v:lbl="Serial Number" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="Location" v:lbl="Location" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="Building" v:lbl="Building" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="Room" v:lbl="Room" v:type="0" v:sortKey="Asset" v:invis="false" v:ask="false" v:langID="1033"/>
+ <v:cp v:nameU="NetworkName" v:lbl="Network Name" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="IPAddress" v:lbl="IP Address" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="SubnetMask" v:lbl="Subnet Mask" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="AdminInterface" v:lbl="Administrative Interface" v:type="0" v:sortKey="Network" v:invis="false"
+ v:ask="false" v:langID="1033"/>
+ <v:cp v:nameU="NumberOfPorts" v:lbl="Number of Ports" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="MACAddress" v:lbl="MAC Address" v:type="0" v:sortKey="Network" v:invis="false" v:ask="false"
+ v:langID="1033"/>
+ <v:cp v:nameU="CommunityString" v:lbl="Community String" v:type="0" v:sortKey="Network" v:invis="false"
+ v:ask="false" v:langID="1033"/>
+ <v:cp v:nameU="NetworkDescription" v:lbl="Network Description" v:type="0" v:sortKey="Network" v:invis="false"
+ v:ask="false" v:langID="1033"/>
+ </v:custProps>
+ <v:userDefs>
+ <v:ud v:nameU="HasText" v:val="VT0(1):5"/>
+ <v:ud v:nameU="ShapeClass" v:val="VT0(5):26"/>
+ <v:ud v:nameU="ShapeType" v:val="VT0(8):26"/>
+ <v:ud v:nameU="SubShapeType" v:val="VT0(66):26"/>
+ <v:ud v:nameU="visLegendShape" v:val="VT0(2):26"/>
+ <v:ud v:nameU="SolSH" v:val="VT14({BF0433D9-CD73-4EB5-8390-8653BE590246}):41"/>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <title>ATM switch.37</title>
+ <desc>name: msg_id (type: direct)</desc>
+ <g id="shape38-111" v:mID="38" v:groupContext="shape" transform="translate(-0.359055,0)">
+ <title>Sheet.38</title>
+ <path d="M28.35 279.79 L42.52 271.61 L42.52 239.47 L14.17 223.1 L0 231.28 L0 263.43 L28.35 279.79 Z" class="st2"/>
+ </g>
+ <g id="shape39-113" v:mID="39" v:groupContext="shape" transform="translate(28.1575,-0.0944882)">
+ <title>Sheet.39</title>
+ <path d="M0 247.65 L0 279.79 L14.17 271.61 L14.17 239.47 L0 247.65 Z" class="st3"/>
+ </g>
+ <g id="shape40-116" v:mID="40" v:groupContext="shape" transform="translate(-0.188976,-32.2386)">
+ <title>Sheet.40</title>
+ <path d="M0 263.43 L28.35 279.79 L42.52 271.61 L14.17 255.24 L0 263.43 Z" class="st4"/>
+ </g>
+ <g id="shape41-119" v:mID="41" v:groupContext="shape" transform="translate(-0.188976,-0.0944882)">
+ <title>Sheet.41</title>
+ <path d="M0 263.43 L28.35 279.79 L28.35 247.65 L0 231.28 L0 263.43 Z" class="st5"/>
+ </g>
+ <g id="shape42-122" v:mID="42" v:groupContext="shape" transform="translate(-0.188976,-0.0944882)">
+ <title>Sheet.42</title>
+ <path d="M0 231.28 L0 263.43 L28.35 279.79 L42.52 271.61 L42.52 239.47 L14.17 223.1 L0 231.28" class="st6"/>
+ </g>
+ <g id="shape43-125" v:mID="43" v:groupContext="shape" transform="translate(1.88976,-6.80315)">
+ <title>Sheet.43</title>
+ <path d="M4.05 244.46 L0 246.76 L4.05 253.74 L4.05 250.02 L7.09 251.78 L11.14 261.54 L7.09 266.63 L4.05 264.87 L4.05
+ 261.16 L0 263.46 L4.05 270.44 L4.05 266.73 A59.6713 55.5985 -178.23 0 0 8.1 269.07 L12.15 263.98 L16.2
+ 273.74 L20.25 276.08 L20.25 279.79 L24.3 277.49 L20.25 270.51 L20.25 274.22 L17.21 272.47 L13.16 262.71
+ L17.21 257.62 L20.25 259.38 L20.25 263.09 L24.3 260.79 L20.25 253.81 L20.25 257.52 L16.2 255.18 A89.6201
+ 83.5031 -177.36 0 0 12.15 260.27 L8.1 250.51 L4.05 248.17 L4.05 244.46 Z" class="st7"/>
+ </g>
+ <g id="shape37-127" v:mID="37" v:groupContext="groupContent">
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="21.2598" cy="298.195" width="79.22" height="36.8038"/>
+ <text x="-12.99" y="294.59" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>name: msg_id<v:newlineChar/><tspan
+ x="-10.36" dy="1.2em" class="st9">(</tspan>type: direct)</text> </g>
+ </g>
+ <g id="group44-130" transform="translate(236.026,-89.6315)" v:mID="44" v:groupContext="group">
+ <title>Sheet.44</title>
+ <g id="shape45-131" v:mID="45" v:groupContext="shape">
+ <title>Rectangle</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="245.777" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape46-133" v:mID="46" v:groupContext="shape" transform="translate(8.50394,-5.68434E-014)">
+ <title>Rectangle.10</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="245.777" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape47-135" v:mID="47" v:groupContext="shape" transform="translate(17.0079,-5.68434E-014)">
+ <title>Rectangle.11</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="245.777" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape48-137" v:mID="48" v:groupContext="shape" transform="translate(25.5118,-5.68434E-014)">
+ <title>Rectangle.12</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="245.777" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape49-139" v:mID="49" v:groupContext="shape" transform="translate(34.0157,-5.68434E-014)">
+ <title>Rectangle.13</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="245.777" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape50-141" v:mID="50" v:groupContext="shape" transform="translate(42.5197,-5.68434E-014)">
+ <title>Rectangle.14</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="245.777" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ <g id="shape51-143" v:mID="51" v:groupContext="shape" transform="translate(51.0236,-5.68434E-014)">
+ <title>Rectangle.15</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <rect x="0" y="245.777" width="8.50394" height="34.0157" class="st10"/>
+ </g>
+ </g>
+ <g id="shape52-145" v:mID="52" v:groupContext="shape" transform="translate(216.183,-75.4582)">
+ <title>Sheet.52</title>
+ <desc>key: msg_id</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="49.6063" cy="272.706" width="99.22" height="14.1732"/>
+ <rect x="0" y="265.62" width="99.2126" height="14.1732" class="st13"/>
+ <text x="20.73" y="276.31" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>key: msg_id</text> </g>
+ <g id="shape53-148" v:mID="53" v:groupContext="shape" transform="translate(295.553,-106.639)">
+ <title>Sheet.53</title>
+ <path d="M0 279.79 L97.91 279.79" class="st14"/>
+ </g>
+ <g id="shape54-153" v:mID="54" v:groupContext="shape" transform="translate(567.679,454.363) rotate(180)">
+ <title>Sheet.54</title>
+ <path d="M0 279.79 L104.88 279.79" class="st15"/>
+ </g>
+ <g id="shape57-158" v:mID="57" v:groupContext="shape" transform="translate(20.0571,-72.6236)">
+ <title>Rectangle.57</title>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <path d="M0 279.79 L113.39 279.79 L113.39 101.21 L0 101.21 L0 279.79 Z" class="st17"/>
+ </g>
+ <g id="shape58-160" v:mID="58" v:groupContext="shape" transform="translate(34.2303,-85.3795)">
+ <title>Rectangle.58</title>
+ <desc>Direct Consumer</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="42.5197" cy="258.533" width="85.04" height="42.5197"/>
+ <rect x="0" y="237.273" width="85.0394" height="42.5197" class="st18"/>
+ <text x="27.83" y="254.93" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Direct<v:newlineChar/><tspan
+ x="17.63" dy="1.2em" class="st9">Consumer</tspan></text> </g>
+ <g id="shape59-164" v:mID="59" v:groupContext="shape" transform="translate(0.75,-47.1118)">
+ <title>Sheet.59</title>
+ <desc>Invoker (e.g. api)</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="76" cy="269.793" width="152" height="20"/>
+ <rect x="0" y="259.793" width="152" height="20" class="st13"/>
+ <text x="57.66" y="266.19" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Invoker<v:newlineChar/><tspan
+ x="54.76" dy="1.2em" class="st9">(</tspan>e.g. api)</text> </g>
+ <g id="shape55-168" v:mID="55" v:groupContext="shape" transform="translate(34.2303,-195.931)">
+ <title>Rectangle.55</title>
+ <desc>Topic Publisher</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(14):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="42.5197" cy="258.533" width="85.04" height="42.5197"/>
+ <rect x="0" y="237.273" width="85.0394" height="42.5197" class="st18"/>
+ <text x="29.37" y="254.93" class="st8" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>Topic <v:newlineChar/><tspan
+ x="19.79" dy="1.2em" class="st9">Publisher</tspan></text> </g>
+ <g id="shape56-172" v:mID="56" v:groupContext="shape" transform="translate(119.27,-217.191)">
+ <title>Sheet.56</title>
+ <path d="M0 279.79 L113.92 279.79" class="st15"/>
+ </g>
+ <g id="shape60-177" v:mID="60" v:groupContext="shape" transform="translate(236.026,452.946) rotate(180)">
+ <title>Sheet.60</title>
+ <path d="M0 279.79 L116.76 279.79" class="st15"/>
+ </g>
+ <g id="shape62-182" v:mID="62" v:groupContext="shape" transform="translate(273.947,-11.6)">
+ <title>Sheet.62</title>
+ <desc>RabbitMQ Node (single virtual host context)</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="76" cy="269.793" width="152" height="20"/>
+ <rect x="0" y="259.793" width="152" height="20" class="st13"/>
+ <text x="16.72" y="264.39" class="st19" v:langID="2057"><v:paragraph v:horizAlign="1"/><v:tabList/>RabbitMQ Node<v:newlineChar/><tspan
+ x="9.51" dy="1.8em" class="st20">(</tspan><tspan class="st20">single virtual host context</tspan><tspan
+ class="st20">)</tspan></text> </g>
+ </g>
+</svg>
diff --git a/doc/source/images/rabbit/state.png b/doc/source/images/rabbit/state.png Binary files differnew file mode 100644 index 000000000..76ce675a9 --- /dev/null +++ b/doc/source/images/rabbit/state.png diff --git a/nova/adminclient.py b/nova/adminclient.py index af55197fc..5a62cce7d 100644 --- a/nova/adminclient.py +++ b/nova/adminclient.py @@ -22,13 +22,15 @@ Nova User API client library. import base64 import boto import httplib + +from nova import flags from boto.ec2.regioninfo import RegionInfo +FLAGS = flags.FLAGS + DEFAULT_CLC_URL = 'http://127.0.0.1:8773' DEFAULT_REGION = 'nova' -DEFAULT_ACCESS_KEY = 'admin' -DEFAULT_SECRET_KEY = 'admin' class UserInfo(object): @@ -192,9 +194,13 @@ class HostInfo(object): class NovaAdminClient(object): - def __init__(self, clc_url=DEFAULT_CLC_URL, region=DEFAULT_REGION, - access_key=DEFAULT_ACCESS_KEY, secret_key=DEFAULT_SECRET_KEY, - **kwargs): + def __init__( + self, + clc_url=DEFAULT_CLC_URL, + region=DEFAULT_REGION, + access_key=FLAGS.aws_access_key_id, + secret_key=FLAGS.aws_secret_access_key, + **kwargs): parts = self.split_clc_url(clc_url) self.clc_url = clc_url diff --git a/nova/api/__init__.py b/nova/api/__init__.py index 7e75445a8..80f9f2109 100644 --- a/nova/api/__init__.py +++ b/nova/api/__init__.py @@ -22,7 +22,6 @@ Root WSGI middleware for all API controllers. :osapi_subdomain: subdomain running the OpenStack API (default: api) :ec2api_subdomain: subdomain running the EC2 API (default: ec2) -:FAKE_subdomain: set to 'api' or 'ec2', requests default to that endpoint """ diff --git a/nova/compute/monitor.py b/nova/compute/monitor.py index d0154600f..ce45b14f6 100644 --- a/nova/compute/monitor.py +++ b/nova/compute/monitor.py @@ -211,8 +211,8 @@ def store_graph(instance_id, filename): # the response we can make our own client that does the actual # request and hands it off to the response parser. s3 = boto.s3.connection.S3Connection( - aws_access_key_id='admin', - aws_secret_access_key='admin', + aws_access_key_id=FLAGS.aws_access_key_id, + aws_secret_access_key=FLAGS.aws_secret_access_key, is_secure=False, calling_format=boto.s3.connection.OrdinaryCallingFormat(), port=FLAGS.s3_port, diff --git a/nova/flags.py b/nova/flags.py index 07b469bca..f7ae26050 100644 --- a/nova/flags.py +++ b/nova/flags.py @@ -179,6 +179,8 @@ DEFINE_list('region_list', [], 'list of region=url pairs separated by commas') DEFINE_string('connection_type', 'libvirt', 'libvirt, xenapi or fake') +DEFINE_string('aws_access_key_id', 'admin', 'AWS Access ID') +DEFINE_string('aws_secret_access_key', 'admin', 'AWS Access Key') DEFINE_integer('s3_port', 3333, 's3 port') DEFINE_string('s3_host', '127.0.0.1', 's3 host') DEFINE_string('compute_topic', 'compute', 'the topic compute nodes listen on') @@ -196,6 +198,8 @@ DEFINE_integer('rabbit_port', 5672, 'rabbit port') DEFINE_string('rabbit_userid', 'guest', 'rabbit userid') DEFINE_string('rabbit_password', 'guest', 'rabbit password') DEFINE_string('rabbit_virtual_host', '/', 'rabbit virtual host') +DEFINE_integer('rabbit_retry_interval', 10, 'rabbit connection retry interval') +DEFINE_integer('rabbit_max_retries', 12, 'rabbit connection attempts') DEFINE_string('control_exchange', 'nova', 'the main exchange to connect to') DEFINE_string('cc_host', '127.0.0.1', 'ip of api server') DEFINE_integer('cc_port', 8773, 'cloud controller port') diff --git a/nova/objectstore/handler.py b/nova/objectstore/handler.py index b26906001..c8920b00c 100644 --- a/nova/objectstore/handler.py +++ b/nova/objectstore/handler.py @@ -61,6 +61,7 @@ from nova.objectstore import image FLAGS = flags.FLAGS +flags.DEFINE_string('s3_listen_host', '', 'Host to listen on.') def render_xml(request, value): @@ -438,6 +439,7 @@ def get_application(): # Disabled because of lack of proper introspection in Twisted # or possibly different versions of twisted? # pylint: disable-msg=E1101 - objectStoreService = internet.TCPServer(FLAGS.s3_port, factory) + objectStoreService = internet.TCPServer(FLAGS.s3_port, factory, + interface=FLAGS.s3_listen_host) objectStoreService.setServiceParent(application) return application diff --git a/nova/rpc.py b/nova/rpc.py index 9938b0838..86a29574f 100644 --- a/nova/rpc.py +++ b/nova/rpc.py @@ -38,8 +38,8 @@ from nova import fakerabbit from nova import flags from nova import context -FLAGS = flags.FLAGS +FLAGS = flags.FLAGS LOG = logging.getLogger('amqplib') LOG.setLevel(logging.DEBUG) @@ -83,19 +83,24 @@ class Consumer(messaging.Consumer): Contains methods for connecting the fetch method to async loops """ def __init__(self, *args, **kwargs): - self.failed_connection = False - - while True: + for i in xrange(FLAGS.rabbit_max_retries): + if i > 0: + time.sleep(FLAGS.rabbit_retry_interval) try: super(Consumer, self).__init__(*args, **kwargs) + self.failed_connection = False break except: # Catching all because carrot sucks - logging.exception("AMQP server on %s:%d is unreachable. " \ - "Trying again in 30 seconds." % ( - FLAGS.rabbit_host, - FLAGS.rabbit_port)) - time.sleep(30) - continue + logging.exception("AMQP server on %s:%d is unreachable." \ + " Trying again in %d seconds." % ( + FLAGS.rabbit_host, + FLAGS.rabbit_port, + FLAGS.rabbit_retry_interval)) + self.failed_connection = True + if self.failed_connection: + logging.exception("Unable to connect to AMQP server" \ + " after %d tries. Shutting down." % FLAGS.rabbit_max_retries) + sys.exit(1) def fetch(self, no_ack=None, auto_ack=None, enable_callbacks=False): """Wraps the parent fetch with some logic for failed connections""" @@ -103,7 +108,7 @@ class Consumer(messaging.Consumer): # refactored into some sort of connection manager object try: if self.failed_connection: - # NOTE(vish): conn is defined in the parent class, we can + # NOTE(vish): connection is defined in the parent class, we can # recreate it as long as we create the backend too # pylint: disable-msg=W0201 self.connection = Connection.recreate() diff --git a/nova/server.py b/nova/server.py index cb424caa1..a0ee54681 100644 --- a/nova/server.py +++ b/nova/server.py @@ -42,6 +42,8 @@ flags.DEFINE_bool('daemonize', False, 'daemonize this process') # clutter. flags.DEFINE_bool('use_syslog', True, 'output to syslog when daemonizing') flags.DEFINE_string('logfile', None, 'log file to output to') +flags.DEFINE_string('logdir', None, 'directory to keep log files in ' + '(will be prepended to $logfile)') flags.DEFINE_string('pidfile', None, 'pid file to output to') flags.DEFINE_string('working_directory', './', 'working directory...') flags.DEFINE_integer('uid', os.getuid(), 'uid under which to run') @@ -119,6 +121,8 @@ def daemonize(args, name, main): else: if not FLAGS.logfile: FLAGS.logfile = '%s.log' % name + if FLAGS.logdir: + FLAGS.logfile = os.path.join(FLAGS.logdir, FLAGS.logfile) logfile = logging.FileHandler(FLAGS.logfile) logfile.setFormatter(formatter) logger.addHandler(logfile) diff --git a/nova/tests/misc_unittest.py b/nova/tests/misc_unittest.py new file mode 100644 index 000000000..856060afa --- /dev/null +++ b/nova/tests/misc_unittest.py @@ -0,0 +1,48 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 OpenStack LLC +# +# 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. + +import os +import subprocess + +from nova import test +from nova.utils import parse_mailmap, str_dict_replace + + +class ProjectTestCase(test.TrialTestCase): + def test_authors_up_to_date(self): + if os.path.exists('../.bzr'): + log_cmd = subprocess.Popen(["bzr", "log", "-n0"], + stdout=subprocess.PIPE) + changelog = log_cmd.communicate()[0] + mailmap = parse_mailmap('../.mailmap') + + contributors = set() + for l in changelog.split('\n'): + l = l.strip() + if (l.startswith('author:') or l.startswith('committer:') + and not l == 'committer: Tarmac'): + email = l.split(' ')[-1] + contributors.add(str_dict_replace(email, mailmap)) + + authors_file = open('../Authors', 'r').read() + + missing = set() + for contributor in contributors: + if not contributor in authors_file: + missing.add(contributor) + + self.assertTrue(len(missing) == 0, + '%r not listed in Authors' % missing) diff --git a/nova/twistd.py b/nova/twistd.py index 3ec0ff61e..cb5648ce6 100644 --- a/nova/twistd.py +++ b/nova/twistd.py @@ -43,6 +43,8 @@ else: FLAGS = flags.FLAGS +flags.DEFINE_string('logdir', None, 'directory to keep log files in ' + '(will be prepended to $logfile)') class TwistdServerOptions(ServerOptions): @@ -246,6 +248,8 @@ def serve(filename): FLAGS.logfile = '%s.log' % name elif FLAGS.logfile.endswith('twistd.log'): FLAGS.logfile = FLAGS.logfile.replace('twistd.log', '%s.log' % name) + if FLAGS.logdir: + FLAGS.logfile = os.path.join(FLAGS.logdir, FLAGS.logfile) if not FLAGS.prefix: FLAGS.prefix = name elif FLAGS.prefix.endswith('twisted'): diff --git a/nova/utils.py b/nova/utils.py index 2970b93bb..142584df8 100644 --- a/nova/utils.py +++ b/nova/utils.py @@ -175,6 +175,24 @@ def parse_isotime(timestr): return datetime.datetime.strptime(timestr, TIME_FORMAT) +def parse_mailmap(mailmap='.mailmap'): + mapping = {} + if os.path.exists(mailmap): + fp = open(mailmap, 'r') + for l in fp: + l = l.strip() + if not l.startswith('#') and ' ' in l: + canonical_email, alias = l.split(' ') + mapping[alias] = canonical_email + return mapping + + +def str_dict_replace(s, mapping): + for s1, s2 in mapping.iteritems(): + s = s.replace(s1, s2) + return s + + class LazyPluggable(object): """A pluggable backend loaded lazily based on some value.""" diff --git a/nova/virt/xenapi.py b/nova/virt/xenapi.py index ec5e7456a..5bf98468e 100644 --- a/nova/virt/xenapi.py +++ b/nova/virt/xenapi.py @@ -289,11 +289,21 @@ class XenAPIConnection(object): # Don't complain, just return. This lets us clean up instances # that have already disappeared from the underlying platform. defer.returnValue(None) + # Get the VDIs related to the VM + vdis = yield self._lookup_vm_vdis(vm) try: task = yield self._call_xenapi('Async.VM.hard_shutdown', vm) yield self._wait_for_task(task) except Exception, exc: logging.warn(exc) + # Disk clean-up + if vdis: + for vdi in vdis: + try: + task = yield self._call_xenapi('Async.VDI.destroy', vdi) + yield self._wait_for_task(task) + except Exception, exc: + logging.warn(exc) try: task = yield self._call_xenapi('Async.VM.destroy', vm) yield self._wait_for_task(task) @@ -402,6 +412,30 @@ class XenAPIConnection(object): True, {}) return sr + @utils.deferredToThread + def _lookup_vm_vdis(self, vm): + return self._lookup_vm_vdis_blocking(vm) + + def _lookup_vm_vdis_blocking(self, vm): + # Firstly we get the VBDs, then the VDIs. + # TODO: do we leave the read-only devices? + vbds = self._conn.xenapi.VM.get_VBDs(vm) + vdis = [] + if vbds: + for vbd in vbds: + try: + vdi = self._conn.xenapi.VBD.get_VDI(vbd) + # Test valid VDI + record = self._conn.xenapi.VDI.get_record(vdi) + except Exception, exc: + logging.warn(exc) + else: + vdis.append(vdi) + if len(vdis) > 0: + return vdis + else: + return None + def _wait_for_task(self, task): """Return a Deferred that will give the result of the given task. The task is polled until it completes.""" diff --git a/nova/wsgi.py b/nova/wsgi.py index b04b487ea..c7ee9ed14 100644 --- a/nova/wsgi.py +++ b/nova/wsgi.py @@ -28,7 +28,7 @@ from xml.dom import minidom import eventlet import eventlet.wsgi -eventlet.patcher.monkey_patch(all=False, socket=True) +eventlet.patcher.monkey_patch(all=False, socket=True, time=True) import routes import routes.middleware import webob diff --git a/run_tests.py b/run_tests.py index 101ed1a0b..3d427d8af 100644 --- a/run_tests.py +++ b/run_tests.py @@ -49,11 +49,12 @@ from nova import flags from nova import twistd from nova.tests.access_unittest import * -from nova.tests.auth_unittest import * from nova.tests.api_unittest import * +from nova.tests.auth_unittest import * from nova.tests.cloud_unittest import * from nova.tests.compute_unittest import * from nova.tests.flags_unittest import * +from nova.tests.misc_unittest import * from nova.tests.network_unittest import * from nova.tests.objectstore_unittest import * from nova.tests.process_unittest import * @@ -64,6 +65,7 @@ from nova.tests.service_unittest import * from nova.tests.twistd_unittest import * from nova.tests.validator_unittest import * from nova.tests.virt_unittest import * +from nova.tests.virt_unittest import * from nova.tests.volume_unittest import * @@ -16,13 +16,14 @@ # License for the specific language governing permissions and limitations # under the License. +import os +import subprocess + from setuptools import setup, find_packages from setuptools.command.sdist import sdist from sphinx.setup_command import BuildDoc -import os -import subprocess - +from nova.utils import parse_mailmap, str_dict_replace class local_BuildDoc(BuildDoc): def run(self): @@ -42,8 +43,9 @@ class local_sdist(sdist): log_cmd = subprocess.Popen(["bzr", "log", "--novalog"], stdout=subprocess.PIPE, env=env) changelog = log_cmd.communicate()[0] + mailmap = parse_mailmap() with open("ChangeLog", "w") as changelog_file: - changelog_file.write(changelog) + changelog_file.write(str_dict_replace(changelog, mailmap)) sdist.run(self) setup(name='nova', |
