tag:blogger.com,1999:blog-87112504934657851992024-02-02T02:06:23.466-05:00Software Defined BodenBoden's Cloud Computing, Virtualization and Software Solutions web logbodenhttp://www.blogger.com/profile/01576924395167177601noreply@blogger.comBlogger8125tag:blogger.com,1999:blog-8711250493465785199.post-45719620940579721472016-09-23T10:59:00.000-04:002016-09-23T10:59:18.088-04:00OpenStack Neutron VMware NSX REST API Extension Refence Now Available<h3>
Forward</h3>
The OpenStack neutron team has done a fantastic job consolidating the neutron REST API reference source into the <a href="https://github.com/openstack/neutron-lib/tree/master/api-ref/source">neutron-lib tree</a> (note that this is an ongoing effort). Once built, the resulting documentation is published to the docs site and is what you see when viewing the <a href="http://developer.openstack.org/api-ref/networking/v2/">neutron api-ref</a>. While <a href="https://github.com/openstack/neutron-specs/blob/master/specs/newton/neutron-stadium.rst">stadium projects</a> can contribute their api-ref to the neutron-lib tree, non-stadium projects (such as the numerous neutron plugins including the VMware NSX plugin) must publish/maintain their own API reference documentation.<br />
<br />
<br />
<h3>
VMware NSX Neutron Plugin REST API Reference</h3>
We recently decided the most straight forward place to publish the OpenStack neutron VMware NSX plugin REST api-ref was right alongside the plugin <a href="https://github.com/openstack/vmware-nsx">source code</a>. This document is in markdown format and can be found at <a href="https://github.com/openstack/vmware-nsx/blob/master/api-ref/rest.md">vmware-nsx/api-ref/rest.md</a>.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxadUTX4_p4uYbkjMQrCR0nUOBsbVw_kJ4NSOCCmYKEcDIXwGzdBesVQY6KFaTNSJ9geYpLDGjDRZ7sGjvceCS04i3sG7juP9rBoWSwg6slgsdvUcMurycWYLJh8bNZaXnKqgFEdqX744/s1600/Screen+Shot+2016-09-23+at+8.51.47+AM.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" height="351" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxadUTX4_p4uYbkjMQrCR0nUOBsbVw_kJ4NSOCCmYKEcDIXwGzdBesVQY6KFaTNSJ9geYpLDGjDRZ7sGjvceCS04i3sG7juP9rBoWSwg6slgsdvUcMurycWYLJh8bNZaXnKqgFEdqX744/s400/Screen+Shot+2016-09-23+at+8.51.47+AM.png" title="VMware NSX OpenStack neutron api-ref rendered in markdown" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">OpenStack neutron VMware NSX api-ref rendered in markdown</td></tr>
</tbody></table>
<br />
Moving forward, our goal is to keep the VMware NSX plugin api-ref in sync with the plugin source code so consumers can always find the api-ref for the release of the plugin they are using. Consumers using the VMware NSX neutron plugin for release <span style="font-family: Courier New, Courier, monospace;"><i>REL</i></span> can access the following URL to view its api-ref:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">https://github.com/openstack/vmware-nsx/tree/stable/<i>REL</i>/api-ref/rest.md</span><br />
<br />
However since we <a href="https://github.com/openstack/vmware-nsx/commit/32d9a3023f2b20dc6b636fddfe7f2221d3ce3cfd">just committed</a> this documentation, consumers will only be able to access the api-ref using the above URL starting with the Ocata release (for now it can be accessed from the <span style="font-family: Courier New, Courier, monospace;"><a href="https://github.com/openstack/vmware-nsx/blob/master/api-ref/rest.md">master</a></span> branch of the plugin source repository).<br />
<br />
We look forward to any feedback on this api-ref so feel free to <a href="https://bugs.launchpad.net/vmware-nsx">open a bug</a>, or reach out to me directly.bodenhttp://www.blogger.com/profile/01576924395167177601noreply@blogger.comtag:blogger.com,1999:blog-8711250493465785199.post-3008426055195653302016-09-13T15:33:00.000-04:002016-09-13T15:33:00.255-04:00What's new with neutron-lib 0.4.0<h3>
Forward</h3>
OpenStack neutron-lib version 0.4.0 was recently released to <a href="https://pypi.python.org/pypi/neutron-lib" target="_blank">PyPI</a> and contains a number of updates to <a href="https://github.com/openstack/neutron-lib/blob/master/neutron_lib/constants.py">constants</a>, <a href="https://github.com/openstack/neutron-lib/tree/master/neutron_lib/db">db</a>, <a href="https://github.com/openstack/neutron-lib/blob/master/neutron_lib/exceptions.py">exceptions</a>, <a href="https://github.com/openstack/neutron-lib/blob/master/neutron_lib/policy.py">policy</a> and <a href="https://github.com/openstack/neutron-lib/tree/master/neutron_lib/utils">utils</a>.<br />
<br />
The complete list of public API changes are summarized below (and can be <a href="https://github.com/openstack/neutron-lib/compare/0.3.0...0.4.0" target="_blank">viewed on github</a>):<br />
<pre style="background-color: #f7f7f7; border-radius: 3px; box-sizing: border-box; color: #333333; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 11.9px; font-stretch: normal; line-height: 1.45; overflow: auto; padding: 16px; word-wrap: normal;"><code style="background: transparent; border-radius: 3px; border: 0px; box-sizing: border-box; display: inline; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 11.9px; line-height: inherit; margin: 0px; overflow: visible; padding: 0px; word-break: normal; word-wrap: normal;">New API Signatures
-----------------------------------------------------
neutron_lib.constants.DEVICE_OWNER_BAREMETAL_PREFIX = baremetal:
neutron_lib.db.constants.DESCRIPTION_FIELD_SIZE = 255
neutron_lib.db.constants.DEVICE_ID_FIELD_SIZE = 255
neutron_lib.db.constants.DEVICE_OWNER_FIELD_SIZE = 255
neutron_lib.db.constants.IP_ADDR_FIELD_SIZE = 64
neutron_lib.db.constants.LONG_DESCRIPTION_FIELD_SIZE = 1024
neutron_lib.db.constants.MAC_ADDR_FIELD_SIZE = 32
neutron_lib.db.constants.NAME_FIELD_SIZE = 255
neutron_lib.db.constants.PROJECT_ID_FIELD_SIZE = 255
neutron_lib.db.constants.RESOURCE_TYPE_FIELD_SIZE = 255
neutron_lib.db.constants.STATUS_FIELD_SIZE = 16
neutron_lib.db.constants.UUID_FIELD_SIZE = 36
neutron_lib.db.model_base.BASEV2 = PYIR UNKNOWN VALUE
neutron_lib.db.model_base.HasId
neutron_lib.db.model_base.HasId.id = PYIR UNKNOWN VALUE
neutron_lib.db.model_base.HasProject
neutron_lib.db.model_base.HasProject.get_tenant_id(self)
neutron_lib.db.model_base.HasProject.project_id = PYIR UNKNOWN VALUE
neutron_lib.db.model_base.HasProject.set_tenant_id(self, value)
neutron_lib.db.model_base.HasProject.tenant_id(cls)
neutron_lib.db.model_base.HasProjectNoIndex
neutron_lib.db.model_base.HasProjectNoIndex.project_id = PYIR UNKNOWN VALUE
neutron_lib.db.model_base.HasProjectPrimaryKey
neutron_lib.db.model_base.HasProjectPrimaryKey.project_id = PYIR UNKNOWN VALUE
neutron_lib.db.model_base.HasProjectPrimaryKeyIndex
neutron_lib.db.model_base.HasProjectPrimaryKeyIndex.project_id = PYIR UNKNOWN VALUE
neutron_lib.db.model_base.HasStatusDescription
neutron_lib.db.model_base.HasStatusDescription.status = PYIR UNKNOWN VALUE
neutron_lib.db.model_base.HasStatusDescription.status_description = PYIR UNKNOWN VALUE
neutron_lib.db.model_base.NeutronBaseV2
neutron_lib.db.utils.is_retriable(exception)
neutron_lib.db.utils.reraise_as_retryrequest(function)
neutron_lib.exceptions.DeviceNotFoundError
neutron_lib.exceptions.DeviceNotFoundError.message = Device '%(device_name)s' does not exist.
neutron_lib.exceptions.MultipleExceptions
neutron_lib.exceptions.PolicyCheckError
neutron_lib.exceptions.PolicyCheckError.message = Failed to check policy %(policy)s because %(reason)s.
neutron_lib.exceptions.PolicyInitError
neutron_lib.exceptions.PolicyInitError.message = Failed to initialize policy %(policy)s because %(reason)s.
neutron_lib.hacking.checks.check_no_eventlet_imports(logical_line)
neutron_lib.hacking.translation_checks.check_delayed_string_interpolation(logical_line, filename, noqa)
neutron_lib.policy.check_is_admin(context)
neutron_lib.policy.check_is_advsvc(context)
neutron_lib.policy.init(conf=PYIR UNKNOWN VALUE, policy_file=None)
neutron_lib.policy.refresh(policy_file=None)
neutron_lib.policy.reset()
neutron_lib.utils.file.ensure_dir(dir_path)
neutron_lib.utils.file.replace_file(file_name, data, file_mode=420)
neutron_lib.utils.helpers._(s)
neutron_lib.utils.helpers.camelize(s)
neutron_lib.utils.helpers.compare_elements(a, b)
neutron_lib.utils.helpers.dict2str(dic)
neutron_lib.utils.helpers.dict2tuple(d)
neutron_lib.utils.helpers.diff_list_of_dict(old_list, new_list)
neutron_lib.utils.helpers.get_random_string(length)
neutron_lib.utils.helpers.parse_mappings(mapping_list, unique_values=True, unique_keys=True)
neutron_lib.utils.helpers.round_val(val)
neutron_lib.utils.helpers.safe_decode_utf8(s)
neutron_lib.utils.helpers.safe_sort_key(value)
neutron_lib.utils.helpers.str2dict(string)
neutron_lib.utils.host.cpu_count()
neutron_lib.utils.net.get_hostname()
-----------------------------------------------------
Removed API Signatures
-----------------------------------------------------
-----------------------------------------------------
Changed API Signatures
-----------------------------------------------------
-----------------------------------------------------</code></pre>
<br />
Note that the report above does not include private API changes, tests, etc.. As always consumers should refrain from using private APIs as they are susceptible to change at any time.<br />
<br />
In the <a href="http://bodenr.blogspot.com/2016/08/whats-new-with-neutron-lib-0.html">previous neutron-lib release blog</a> we dug into some of the actual API usage with sample python code. However as neutron-lib 0.4.0 has a number of new APIs, we'll stick a high-level overview in this post and forgo the python code samples.<br />
<br />
<br />
<h3>
Database</h3>
As shown in the public API report above, a number of classes, functions and constants have been re-homed from <span style="font-family: Courier New, Courier, monospace;">neutron.db</span> into <span style="font-family: Courier New, Courier, monospace;">neutron_lib.db </span>(for more details see the <a href="https://review.openstack.org/#/c/339875/">review</a>). The goal here is to centralize common database functionality used across neutron stadium projects into neutron-lib. As part of this effort we need to be careful not to pull over any database functionality that couples neutron-lib to neutron.<br />
<br />
In neutron-lib 0.4.0 <span style="font-family: Courier New, Courier, monospace;">neutron_lib.db.constants</span> was added and defines a number of common database field sizes for use in place of statically typed field size values. For example, instead of using <span style="font-family: Courier New, Courier, monospace;">255</span> to define the size of a description field, consumers can use the <span style="font-family: Courier New, Courier, monospace;">neutron_lib.db.constants.DESCRIPTION_FIELD_SIZE</span> constant.<br />
<br />
Additionally <span style="font-family: Courier New, Courier, monospace;">neutron_lib.db.model_base</span> was added. This module contains a handful of "barebones" neutron base model definitions/mix-ins such as <span style="font-family: Courier New, Courier, monospace;">HasProject</span> and others. Consumers can now start replacing their use of these models from neutron with the definition in <span style="font-family: Courier New, Courier, monospace;">neutron_lib.db.model_base</span>.<br />
<br />
Two new functions were also added to <span style="font-family: Courier New, Courier, monospace;">neutron_lib.db.utils</span><span style="font-family: inherit;"> (see API report above).</span> These functions have been re-homed from <span style="font-family: Courier New, Courier, monospace;">neutron.db.api</span> and are now ready for use.<br />
<br />
<br />
<h3>
Exceptions</h3>
A few exceptions where re-homed to neutron-lib including <span style="font-family: Courier New, Courier, monospace;">DeviceNotFoundError</span>, <span style="font-family: Courier New, Courier, monospace;">MultipleExceptions</span>, <span style="font-family: Courier New, Courier, monospace;">PolicyCheckError</span> and <span style="font-family: Courier New, Courier, monospace;">PolicyInitError</span>. These exceptions are now ready for consumption in neutron-lib and will soon be deprecated in their neutron origination.<br />
<br />
<br />
<h3>
Hacking Checks</h3>
The 0.4.0 release of neutron-lib contains two new hacking checks.<br />
<br />
As the names imply, <span style="font-family: Courier New, Courier, monospace;">check_no_eventlet_imports</span> checks that the <span style="font-family: Courier New, Courier, monospace;">eventlet</span> library is not imported and <span style="font-family: Courier New, Courier, monospace;">check_delayed_string_interpolation</span> ensures all logging calls use delay string interpolation. While <span style="font-family: "Courier New", Courier, monospace;">check_no_eventlet_imports</span> is intended for neutron-lib specific hacking checks (consumers need not comply)<span style="font-family: inherit;">, </span><span style="font-family: "Courier New", Courier, monospace;">check_delayed_string_interpolation</span> will likely become one of the checks registered in neutron-lib's hacking check factory longer-term.<br />
<br />
Neither checks are automatically registered in neutron-lib's hacking check factory for 0.4.0. Before rolling out new hacking checks (via factory), we need to better solidify neutron-lib's hacking check consumption and roll-out process (for example <a href="https://review.openstack.org/#/c/350723/">patch 350723</a>).<br />
<br />
<br />
<h3>
Policy</h3>
Neutron's <span style="font-family: Courier New, Courier, monospace;">policy</span> API was re-homed to neutron-lib in 0.4.0 with <a href="https://review.openstack.org/#/c/303867/">patch 303867</a>. This change adds the <span style="font-family: Courier New, Courier, monospace;">neutron_lib.policy</span> module and it's public APIs. Consumers should start moving their code to neutron_lib's policy rather than using neutrons.<br />
<br />
<br />
<h3>
Utils</h3>
In 0.4.0 we starting re-homing the common neutron utils into the <span style="font-family: Courier New, Courier, monospace;">neutron_lib.utils</span> package (<a href="https://review.openstack.org/#/c/319769/">see 319769</a>). Utility APIs in neutron-lib are grouped by functionality and thus we have modules like; <span style="font-family: Courier New, Courier, monospace;">neutron_lib.utils.net</span>, <span style="font-family: Courier New, Courier, monospace;">neutron_lib.utils.host</span>, etc.. Consumers can now start using these utils by importing the respective modules they need, rather than calling these utility APIs from neutron.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />bodenhttp://www.blogger.com/profile/01576924395167177601noreply@blogger.comtag:blogger.com,1999:blog-8711250493465785199.post-66347731863351858092016-08-15T08:06:00.001-04:002016-08-15T08:12:55.881-04:00What's new with neutron-lib 0.3.0<h3>
Forward</h3>
OpenStack neutron-lib version 0.3.0 was recently released to <a href="https://pypi.python.org/pypi/neutron-lib" target="_blank">PyPI</a> and contains a number of updates to <a href="https://github.com/openstack/neutron-lib/blob/0.3.0/neutron_lib/api/validators.py" target="_blank">API validators</a>, <a href="https://github.com/openstack/neutron-lib/blob/0.3.0/neutron_lib/constants.py" target="_blank">constants</a> and <a href="https://github.com/openstack/neutron-lib/tree/0.3.0/neutron_lib/hacking" target="_blank">hacking checks</a>.<br />
<br />
The complete list of public API changes are summarized below (and can be <a href="https://github.com/openstack/neutron-lib/compare/0.2.0...0.3.0" target="_blank">viewed on github</a>):
<br />
<pre style="background: #f0f0f0; border: 1px dashed #cccccc; color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> New API Signatures
-----------------------------------------------------
neutron_lib.api.validators.get_validator(validation_type, default=None)
neutron_lib.api.validators.validate_integer(data, valid_values=None)
neutron_lib.api.validators.validate_subports(data, valid_values=None)
neutron_lib.constants.DHCPV6_STATEFUL = dhcpv6-stateful
neutron_lib.constants.DHCPV6_STATELESS = dhcpv6-stateless
neutron_lib.constants.IPV6_MODES = [u'dhcpv6-stateful', u'dhcpv6-stateless', u'slaac']
neutron_lib.constants.IPV6_SLAAC = slaac
neutron_lib.constants.L3_AGENT_MODE = agent_mode
neutron_lib.constants.L3_AGENT_MODE_DVR = dvr
neutron_lib.constants.L3_AGENT_MODE_DVR_SNAT = dvr_snat
neutron_lib.constants.L3_AGENT_MODE_LEGACY = legacy
neutron_lib.constants.Sentinel
neutron_lib.hacking.translation_checks.check_log_warn_deprecated(logical_line, filename)
neutron_lib.hacking.translation_checks.check_raised_localized_exceptions(logical_line, filename)
neutron_lib.hacking.translation_checks.no_translate_debug_logs(logical_line, filename)
neutron_lib.hacking.translation_checks.validate_log_translations(logical_line, physical_line, filename)
-----------------------------------------------------
Removed API Signatures
-----------------------------------------------------
-----------------------------------------------------
Changed API Signatures
-----------------------------------------------------
-----------------------------------------------------
</code></pre>
<br />
<br />
<b>Note:</b><br />
The above public API changes were generated using a <a href="https://review.openstack.org/#/c/338571/" target="_blank">new tool</a> we're looking to include with neutron-lib and eventually perhaps in the change summary for each neutron-lib release.<br />
<br />
<br />
<h3>
API Validators</h3>
Two new validators were added in neutron-lib 0.3.0; <span style="font-family: "courier new" , "courier" , monospace; font-size: normal;">validate_integer</span> and <span style="font-family: "courier new" , "courier" , monospace; font-size: normal;">validate_subports</span>.<br />
<br />
As expected, <span style="font-family: "courier new" , "courier" , monospace; font-size: normal;">validate_integer</span> ensures a value is in fact an integer. The implementation includes smarts to detect if the value is a <span style="font-family: "courier new" , "courier" , monospace; font-size: normal;">str</span>, <span style="font-family: "courier new" , "courier" , monospace; font-size: normal;">float</span> or <span style="font-family: "courier new" , "courier" , monospace; font-size: normal;">bool</span>; which are often missing in common integer validation functions. In addition, the function supports passing a list of <span style="font-family: "courier new" , "courier" , monospace; font-size: normal;">valid_values</span> to check for value inclusion.<br />
<br />
As with other validator functions, <span style="font-family: "courier new" , "courier" , monospace; font-size: normal;">validate_integer</span> returns <span style="font-family: "courier new" , "courier" , monospace; font-size: normal;">None</span> if the value is valid and a <span style="font-family: "courier new" , "courier" , monospace; font-size: normal;">str</span> message otherwise. The string message for an invalid value is a user friendly message as to why the value is bad.<br />
<br />
Here's a sample python snippet to showcase <span style="font-family: "courier new" , "courier" , monospace; font-size: normal;">validate_integer</span><br />
<br />
<pre style="background-color: #f7f7f7; border-radius: 3px; box-sizing: border-box; color: #333333; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 11.9px; font-stretch: normal; line-height: 1.45; overflow: auto; padding: 16px; word-break: normal; word-wrap: normal;"> <span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">from</span> neutron_lib.api <span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">import</span> validators
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">def</span> <span class="pl-en" style="box-sizing: border-box; color: #795da3;">test_validate</span>(<span class="pl-smi" style="box-sizing: border-box;">validator</span>, <span class="pl-smi" style="box-sizing: border-box;">val</span>, <span class="pl-smi" style="box-sizing: border-box;">valid_values</span><span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">=</span><span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">None</span>):
result <span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">=</span> validator(val, valid_values)
<span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">print</span>(<span class="pl-s" style="box-sizing: border-box; color: #183691;"><span class="pl-pds" style="box-sizing: border-box;">"</span><span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">%s</span>(<span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">%s</span>, <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">%s</span>) --> <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">%s</span><span class="pl-pds" style="box-sizing: border-box;">"</span></span> <span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">%</span> (validator.<span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">__name__</span>, val,
valid_values, result))
<span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">print</span>(<span class="pl-s" style="box-sizing: border-box; color: #183691;"><span class="pl-pds" style="box-sizing: border-box;">"</span>Testing valid values...<span class="pl-pds" style="box-sizing: border-box;">"</span></span>)
test_validate(validators.validate_integer, <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">1</span>)
test_validate(validators.validate_integer, <span class="pl-s" style="box-sizing: border-box; color: #183691;"><span class="pl-pds" style="box-sizing: border-box;">'</span>-9<span class="pl-pds" style="box-sizing: border-box;">'</span></span>)
test_validate(validators.validate_integer, <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">0</span>)
test_validate(validators.validate_integer, <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">7</span>, [<span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">9</span>, <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">8</span>, <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">7</span>])
test_validate(validators.validate_integer, <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">7</span>, [<span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">9</span>, <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">8</span>, <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">7</span>])
<span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">print</span>(<span class="pl-s" style="box-sizing: border-box; color: #183691;"><span class="pl-pds" style="box-sizing: border-box;">"</span><span class="pl-cce" style="box-sizing: border-box;">\n</span>Testing invalid values...<span class="pl-pds" style="box-sizing: border-box;">"</span></span>)
test_validate(validators.validate_integer, <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">True</span>)
test_validate(validators.validate_integer, <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">False</span>)
test_validate(validators.validate_integer, <span class="pl-s" style="box-sizing: border-box; color: #183691;"><span class="pl-pds" style="box-sizing: border-box;">'</span>1.1<span class="pl-pds" style="box-sizing: border-box;">'</span></span>)
test_validate(validators.validate_integer, <span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">-</span><span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">9.98933</span>)
test_validate(validators.validate_integer, <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">7</span>, [<span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">9</span>, <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">8</span>, <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">6</span>]) </pre>
<br />
When run, it outputs:<br />
<br />
<pre style="background: #f0f0f0; border: 1px dashed #cccccc; color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;">
Testing valid values...
validate_integer(1, None) --> None
validate_integer(-9, None) --> None
validate_integer(0, None) --> None
validate_integer(7, [9, 8, 7]) --> None
validate_integer(7, [9, 8, 7]) --> None
Testing invalid values...
validate_integer(True, None) --> 'True' is not an integer:boolean
validate_integer(False, None) --> 'False' is not an integer:boolean
validate_integer(1.1, None) --> '1.1' is not an integer
validate_integer(-9.98933, None) --> '-9.98933' is not an integer
validate_integer(7, [9, 8, 6]) --> '7' is not in [9, 8, 6]
</code></pre>
<br />
<br />
The <span style="font-family: "courier new" , "courier" , monospace; font-size: normal;">validate_subports</span> validator is also new in neutron-lib 0.3.0. This validator is used as part of the <a href="https://blueprints.launchpad.net/neutron/+spec/vlan-aware-vms" target="_blank">vlan-aware-vms</a> workstream currently under development. Rather than diving into the details on this one, we'll defer to blueprint and related change sets.<br />
<br />
Finally in the API validators space, we have some work going on to remove direct access to the <span style="font-family: "courier new" , "courier" , monospace; font-size: normal;">neutron_lib.api.validators.validators</span> attribute. This attribute is a dict of the currently "registered" validators known to neutron_lib.<br />
<br />
Today, consumers add a "local" (validator function defined outside of neutron-lib) validator by directly adding it to the dict.<br />
<br />
For example:<br />
<br />
<pre style="background-color: #f7f7f7; border-radius: 3px; box-sizing: border-box; color: #333333; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 11.9px; font-stretch: normal; line-height: 1.45; overflow: auto; padding: 16px; word-break: normal; word-wrap: normal;">validators.validators[<span class="pl-s" style="box-sizing: border-box; color: #183691;"><span class="pl-pds" style="box-sizing: border-box;">'</span>type:my_validatable_type<span class="pl-pds" style="box-sizing: border-box;">'</span></span>] <span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">=</span> my_validator_function</pre>
<br />
In general, this is bad practice and can cause complications if we ever decide to wrap API validator access with encapsulating logic. Consumers should now use the following accessors:<br />
<br />
<pre style="background-color: #f7f7f7; border-radius: 3px; box-sizing: border-box; color: #333333; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 11.9px; font-stretch: normal; line-height: 1.45; overflow: auto; padding: 16px; word-break: normal; word-wrap: normal;">get_validator(validation_type, <span class="pl-v" style="box-sizing: border-box; color: #ed6a43;">default</span><span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">=</span><span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">None</span>)
add_validator(validation_type, validator)</pre>
<br />
Both of which are defined in the <span style="font-family: "courier new" , "courier" , monospace;">neutron_lib.api.validators</span><span style="font-family: "courier new" , "courier" , monospace; font-size: normal;"> </span>module. We've deprecated direct access to the validators dict and plan to remove it in the OpenStack "P" release.<br />
<br />
For more information on related changes see <a href="https://review.openstack.org/#/c/350259/" target="_blank">review 350259</a>.<br />
<br />
<br />
<h3>
Constants</h3>
The only thing overly interesting about the change in neutron_lib.constants, is the addition of the <span style="font-family: "courier new" , "courier" , monospace;">Sentinel</span> class that allows you to create instances that don't change; even with <span style="font-family: "courier new" , "courier" , monospace;">deepcopy()</span><span style="font-family: "times" , "times new roman" , serif;">. </span>For example:<br />
<br />
<pre style="background-color: #f7f7f7; border-radius: 3px; box-sizing: border-box; color: #333333; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 11.9px; font-stretch: normal; line-height: 1.45; overflow: auto; padding: 16px; word-break: normal; word-wrap: normal;"><pre style="border-radius: 3px; box-sizing: border-box; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 11.9px; font-stretch: normal; line-height: 1.45; overflow: auto; padding: 16px; word-break: normal; word-wrap: normal;"><span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">import</span> copy
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">from</span> neutron_lib.constants <span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">import</span> Sentinel
singleton <span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">=</span> Sentinel()
<span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">print</span>(<span class="pl-s" style="box-sizing: border-box; color: #183691;"><span class="pl-pds" style="box-sizing: border-box;">"</span>deepcopy() = <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">%s</span><span class="pl-pds" style="box-sizing: border-box;">"</span></span> <span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">%</span> (copy.deepcopy(singleton) <span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">==</span> singleton))</pre>
</pre>
<br />
<br />
When run outputs:<br />
<br />
<pre style="background-color: #f7f7f7; border-radius: 3px; box-sizing: border-box; color: #333333; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 11.9px; font-stretch: normal; line-height: 1.45; overflow: auto; padding: 16px; word-wrap: normal;"><code style="background: transparent; border-radius: 3px; border: 0px; box-sizing: border-box; display: inline; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 11.9px; line-height: inherit; margin: 0px; overflow: visible; padding: 0px; word-break: normal; word-wrap: normal;">deepcopy() = True</code></pre>
<br />
<br />
<h3>
Hacking checks</h3>
A handful of new translation <a href="http://docs.openstack.org/developer/hacking/" target="_blank">hacking checks</a> have been added in the 0.3.0 release:<br />
<pre style="background-color: #f7f7f7; border-radius: 3px; box-sizing: border-box; color: #333333; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 11.9px; font-stretch: normal; line-height: 1.45; overflow: auto; padding: 16px; word-wrap: normal;"><code style="background: transparent; border-radius: 3px; border: 0px; box-sizing: border-box; display: inline; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 11.9px; line-height: inherit; margin: 0px; overflow: visible; padding: 0px; word-break: normal; word-wrap: normal;">[N532] Validate that LOG.warning is used instead of LOG.warn. The latter is deprecated.
[N534] Exception messages should be translated
[N533] Validate that debug level logs are not translated
[N531] Validate that LOG messages, except debug ones, have translations</code></pre>
<br />
The behavior of these hacking checks should be evident from the description shown above, so I won't belabor. These checks are all registered via <span style="font-family: "courier new" , "courier" , monospace;">neutron_lib.hacking.checks.factory()</span><span style="font-family: "courier new" , "courier" , monospace; font-size: normal;"> </span>and therefore will be active by default if your project uses the neutron_lib factory function in it's <span style="font-family: "courier new" , "courier" , monospace;">tox.ini</span>.<br />
<br />
Looking forward in this space, we hope to further solidify the hacking check interface as well as the dev-ref for its intended usage. For example: <a href="https://review.openstack.org/#/c/350723" target="_blank">350723</a><br />
<div>
<br /></div>
bodenhttp://www.blogger.com/profile/01576924395167177601noreply@blogger.comtag:blogger.com,1999:blog-8711250493465785199.post-11748860640442683212014-05-01T09:42:00.001-04:002014-06-27T08:33:51.717-04:00KVM and Docker LXC Benchmarking with OpenStack<h2>
<span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">Forward</span></h2>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Linux containers (LXCs) are rapidly becoming the new "unit of deployment" changing how we develop, package, deploy and manage applications at all scales (from test / dev to production service ready environments). This application life cycle transformation also enables fluidity to once frictional use cases in a traditional hypervisor Virtual Machine (VM) environment. For example, developing applications in virtual environments and seamlessly "migrating" to bare metal for production. Not only do containers simplify the workflow and life cycle of application development / deployment, but they also provide performance and density benefits which cannot be overlooked.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"></span><br />
<a name='more'></a><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">At the forefront of Linux Container tooling we have <a href="https://www.docker.io/" target="_blank">docker</a> -- a LXC framework / runtime which abstracts out various aspects of the underlying realization by providing a pluggable architecture supporting various storage types, LXC engines / providers, etc.. In addition to making LXC dead easy and fun, docker also brings a set of capabilities to the table which make containers more productive including; automated builds (make files for LXC images), versioning support, fully featured REST API + CLI, the notion of image repositories and more.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br />
Before going any further, let me reiterate some of the major benefits of Linux Containers from a docker perspective: </span><br />
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Fast</span></li>
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Runtime performance at near bare metal speeds (typically 97+ percent or bare metal -- a few ticks shaven off for bean counters).</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Management operations (boot, stop, start, reboot, etc.) in seconds or milliseconds.</span></li>
</ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Agile</span></li>
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">VM-like agility -- it's still "virtualization".</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Seamlessly move between virtual and bare metal environments permitting new development workflows which reduce costs (e.g. develop on VMs and move to bare metal in the "click of a button" for production).</span></li>
</ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Flexible</span></li>
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Containerize a "system" (OS less the kernel).</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Containerize "application(s)".</span></li>
</ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Lightweight</span></li>
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Just enough Operating System (<a href="http://en.wikipedia.org/wiki/Just_enough_operating_system" target="_blank">JeOS</a>); include only what you need reducing image and container bloat.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Minimal per container penalty which equates to greater density and hence greater returns on existing assets -- imagine packing 100s or 1000s of containers on a single host node.</span></li>
</ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Inexpensive</span></li>
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Open source -- free -- lower TCO.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Supported with out-of-the-box modern Linux kernels.</span></li>
</ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Ecosystem</span></li>
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Growing in popularity -- just checkout the google <a href="http://www.google.com/trends/explore#q=%2Fm%2F0wkcjgj&date=today%2012-m&cmpt=q" target="_blank">trends for docker </a>or <a href="http://www.google.com/trends/explore#q=LXC" target="_blank">LXC</a>.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Vibrant community and numerous 3rd party applications (1000s of prebuilt images on <a href="https://index.docker.io/" target="_blank">docker index</a> and 100s of open source apps on <a href="https://github.com/search?q=docker&ref=cmdform" target="_blank">github</a> or other public sources).</span></li>
</ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Cloudy</span></li>
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Various Cloud management frameworks provide support for creating and managing Linux Containers -- including <a href="https://wiki.openstack.org/wiki/Docker" target="_blank">OpenStack</a> my personal favorite.</span></li>
</ul>
</ul>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Using google-foo (searching), it's fairly easy to find existing information describing the docker LXC workflow, portability, etc.. However to date I haven't seen many data points illustrating the Cloudy operational benefits of LXC or the density potential gained by using a LXC technology vs. a traditional VM. As a result I decided to provide some Cloudy benchmarking using OpenStack with docker LXC and KVM -- the topic of this post and a recent presentation I posted to <a href="http://www.slideshare.net/BodenRussell/kvm-and-docker-lxc-benchmarking-with-openstack" target="_blank">slideshare</a>.<br />
<br />
</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<h2>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Update 05/11/2014</span></h2>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">The benchmarks have been rerun and v2.0 of the results is now available on slideshare (embedded below). An overview of the revision changes are available in the presentation and copied below for your convenience:</span><br />
<br />
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">All tests were re-run using a single docker image throughout the tests (see my Dockerfile).</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">As the result of an astute reader, the 15 VM serial “packing” test reflects VM boot overhead rather than steady-state; this version clarifies such claims.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">A new Cloudy test was added to better understand steady-state CPU.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Rather than presenting direct claims of density, raw data and graphs are presented to let the reader draw their own conclusions.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Additional “in the guest” tests were performed including blogbench.</span></li>
</ul>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"></span><br />
<div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span></div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">In accordance with the v2.0 results, this post has been updated to remove direct claims of density factors or statistical references to performance benefits; I leave such inferences to the readers.</span><br />
<div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span></div>
<div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Please read the FAQ and disclaimer in the presentation.</span></div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<h2>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">OpenStack benchmarking with docker LXC</span></h2>
<span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">As luck would have it my favorite Cloud framework, <a href="http://www.openstack.org/" target="_blank">OpenStack</a>, provides some level of integration with docker LXC. Specifically there has been a <a href="https://wiki.openstack.org/wiki/Docker" target="_blank">nova virt driver for docker LXC</a> (which includes a glance translator to support docker based images) since the Havana time-frame and now in Icehouse we have <a href="http://blog.docker.io/2014/03/docker-will-be-in-openstack-icehouse/" target="_blank">heat integration</a> via a plugin for docker. The diagrams below depict the high level architecture of these components in OpenStack (courtesy of docker presentations).</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxv0WAayNgaZL8SVbBJcmkfn0kkCPd2NwlAOq_YgrjFqwnhy_yklu1ukkwCz-7ggUmsU51Dez9EOKBveakbWRDdf5QXkfGuj-zzow3-i8jT8CRVtv5BmuIEQP0BDM9cuerUkjGV3V8Ab8/s1600/docker-openstack-integration.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="docker nova virt driver and heat plugin for OpenStack" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxv0WAayNgaZL8SVbBJcmkfn0kkCPd2NwlAOq_YgrjFqwnhy_yklu1ukkwCz-7ggUmsU51Dez9EOKBveakbWRDdf5QXkfGuj-zzow3-i8jT8CRVtv5BmuIEQP0BDM9cuerUkjGV3V8Ab8/s1600/docker-openstack-integration.png" height="145" title="docker nova virt driver and heat plugin for OpenStack" width="400" /></a></div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Rather than taking a generic approach to the Cloudy benchmarks, I set out with a specific high level use case in mind -- "As an OpenStack Cloud user, I want a Ubuntu based VM with MySQL" -- and sought to answer the question "why would I choose docker LXC vs KVM". Honing the approach in this fashion allowed me to focus in on a more constrained set of parameters and in particular to use a MySQL enabled VM / Container for the tests.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">To drive the Cloudy tests from an OpenStack perspective, OpenStack project <a href="https://wiki.openstack.org/wiki/Rally" target="_blank">rally</a> fits the bill perfectly. Rally allowed me to drive the OpenStack operations in a consistent, automated fashion while collecting operational times from a user point of view. Thus, rally was used to drive 3 sets of tests:</span><br />
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Steady state packing of 15 VMs on a single compute node (KVM vs. docker LXC).</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Serial packing of 15 VMs on a single compute node (KVM vs. docker LXC).</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Serial soft reboot of VMs on a single compute node (KVM vs docker LXC).</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">VM boot and snapshot the VM to image (KVM vs docker LXC).</span></li>
</ul>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">While rally was used to drive the tests through OpenStack and collect Cloudy operational times, additional metrics were needed from a compute node perspective to gain incite as to the resource usage during the Cloudy operations. I used <a href="http://dag.wiee.rs/home-made/dstat/" target="_blank">dstat</a> to collect various system resource metrics at 1 second intervals </span><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">(in CSV format) </span><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">while the Cloudy benchmarks were running. These metrics where then imported into a spread sheet where they could be analyzed and graphed. The result was a baseline set of data reflecting the average operational times through OpenStack as well as compute node resource metrics collected during those tests.</span><br />
<ul><ul>
</ul>
</ul>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">The presentation in full can be found here:</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<iframe allowfullscreen="" frameborder="0" height="356" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/34122983" style="border-width: 1px 1px 0; border: 1px solid #CCC; margin-bottom: 5px; max-width: 100%;" width="427"> </iframe> <br />
<div style="margin-bottom: 5px;">
<strong> <a href="https://www.slideshare.net/BodenRussell/kvm-and-docker-lxc-benchmarking-with-openstack" target="_blank" title="KVM and docker LXC Benchmarking with OpenStack">KVM and docker LXC Benchmarking with OpenStack</a> </strong> from <strong><a href="http://www.slideshare.net/BodenRussell" target="_blank">Boden Russell</a></strong> </div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">I've also made the raw data results available below on <a href="https://github.com/bodenr/cloudy-docker-kvm-bench/tree/master/results/v2" target="_blank">github</a>. Feel free to use them however you see fit. Note that I didn't have the bandwidth to format / label all the data clearly so if you have questions let me know and I'll do my best to describe / update.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br />Note that although the performance and density factor look promising using the docker integration in OpenStack, these components are still under heavy development and thus lack a full set of feature parity. I believe we will see these gaps closed moving forward, so I would encourage you to put on your python hat and help out if you can.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Finally, I will be discussing these results as well as providing a quick overview on <a href="http://www.slideshare.net/BodenRussell/realizing-linux-containerslxc" target="_blank">realizing linux containers</a> at some upcoming conferences:</span><br />
<br />
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><a href="http://openstacksummitmay2014atlanta.sched.org/event/d12ad435028ca1a6dac2d3bcf58dcdf2#.U2JIg_lkRuk" target="_blank">OpenStack summit in Atlanta, GA </a></span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><a href="http://www.cloudcomputingexpo.com/event/session/2263" target="_blank">CloudExpo in New York</a></span></li>
<li><a href="http://www.dockercon.com/" target="_blank"><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">dockercon14 in San Francisco</span></a></li>
</ul>
<br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">If you attend either of these conferences I would encourage you to stop by my sessions and chat containers. </span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h2>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Parting thoughts for docker image creators</span></h2>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Docker uses a </span><span style="font-family: Courier New, Courier, monospace;">SIGTERM</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> signal to stop your container's processes. By default bash ignores </span><span style="font-family: Courier New, Courier, monospace;">SIGTERM</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> and hence if your container's </span><span style="font-family: Courier New, Courier, monospace;">CMD</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> is bootstrapped using a bash script (or invocation) you will experience longer than necessary stop times for your container unless explicitly trapping / handling the </span><span style="font-family: Courier New, Courier, monospace;">SIGTERM</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">. I would encourage docker image developers to build awareness of this fact and develop their images with </span><span style="font-family: Courier New, Courier, monospace;">SIGTERM</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> handling to ensure optimal container stop times.<br />
</span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>bodenhttp://www.blogger.com/profile/01576924395167177601noreply@blogger.comtag:blogger.com,1999:blog-8711250493465785199.post-89406251644025727672014-03-30T06:09:00.000-04:002014-07-08T13:56:00.031-04:00Managing OpenStack & SoftLayer Resources From A Single Pane of Glass With Jumpgate<h2>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Forward</span></h2>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Imagine a world of interconnected Clouds capable discovering, coordinating and collaborating in harmony to seamlessly carry out complex workloads in a transparent manner -- the <a href="http://en.wikipedia.org/wiki/Intercloud" target="_blank">intercloud</a>. While this may be the dream of tomorrow, today's reality is a form of the intercloud called <a href="http://en.wikipedia.org/wiki/Cloud_computing#Hybrid_cloud" target="_blank">hybrid Cloud</a>. In a hybrid Cloud model organizations manage a number of on-premise resources, but also use off-premise provider services or resources for specific capabilities, in time of excess demand which cannot be fulfilled via on-premise resources, or for cost effectiveness reasons. </span><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">Both of these Cloud computing models have a common conduit to their realization -- open standardized APIs, formats and protocols which enable interoperability between disparate Cloud deployments.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"></span><br />
<a name='more'></a><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Enter <a href="http://www.openstack.org/" target="_blank">OpenStack</a> -- a rapidly growing open source Cloud framework which removes vendor lock-in by providing open, vendor agnostic APIs. OpenStack consists of a number of distributed, scale-out ready services which allow organizations to build Cloud solutions in a more cost effective manner. Just as the name implies OpenStack is open source, open design and open teaming / leadership. As shown in a <a href="https://www.openstack.org/summit/openstack-summit-hong-kong-2013/session-videos/presentation/the-true-state-of-cloud-adoption" target="_blank">2013 Forrester study</a>, collectively OpenStack becoming the most popular private Cloud of choice (see diagram below).</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjy9bhJlZ6VWTPE2uxsDHXm0g9cvg4kp4AyaifF6bDwueiWodILf3DbJU4xoRunJ1o6loQyWXiz8YYd_2rpN1yFHSI0Lg-sN1F49ShjQae2Uy9t9aqy6IPmFPkXdx2R8JQ_2HIMkb27n4/s1600/openstack-2013-private-cloud-usage-stats.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="OpenStack 2013 private Cloud usage survey" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjy9bhJlZ6VWTPE2uxsDHXm0g9cvg4kp4AyaifF6bDwueiWodILf3DbJU4xoRunJ1o6loQyWXiz8YYd_2rpN1yFHSI0Lg-sN1F49ShjQae2Uy9t9aqy6IPmFPkXdx2R8JQ_2HIMkb27n4/s1600/openstack-2013-private-cloud-usage-stats.png" height="216" title="OpenStack 2013 private Cloud usage survey" width="400" /></a></div>
<br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><a href="http://www.softlayer.com/" target="_blank">SoftLayer</a> is the premier Data Center and hosting provider in the industry today offering numerous pre-built managed services and solutions to fit many needs -- from web hosting to private hosted Clouds -- SoftLayer is the right choice. Not only does SoftLayer provide soft services, but they also offer fully dedicated bare metal hardware suitable for the most demanding workloads. SoftLayer also supports a comprehensive set of native APIs allowing developers and operators to take programmatic control over their resources. Wouldn't it be great if you could use OpenStack APIs with SoftLayer? As luck would you have it, you now can.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">The folks over at the SoftLayer innovation team recently released a new open source project called <a href="http://softlayer.github.io/jumpgate/" target="_blank">Jumpgate</a>. With Jumpgate you can use a number of your favorite OpenStack tools and APIs to bridge directly into SoftLayer. For example you can use the OpenStack nova CLI and APIs to boot SoftLayer virtual compute servers, or the OpenStack glance CLI to manage SoftLayer based images. You can even use the OpenStack Horizon dashboard to graphically manage a number of your SoftLayer resources including virtual servers and images.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">In this article we'll cover the following topics:</span><br />
<br />
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">An overview of Jumpgate including its high level architecture.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Step-by-step instructions on how to install and configure Jumpgate including creating an upstart job to manage Jumpgate as a service.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Detailed instructions on how to install and use the OpenStack nova CLI with Jumpgate.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">A guide to setting up the OpenStack Horizon web-based dashboard with multiple regions so that you can manage SoftLayer resources from a single pane of glass.</span></li>
</ul>
<br />
<h2>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Introducing SoftLayer Jumpgate</span></h2>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><a href="http://softlayer.github.io/jumpgate/" target="_blank">Jumpgate</a> is an <a href="https://github.com/softlayer/jumpgate" target="_blank">open source project</a> started by the folks over at <a href="http://www.softlayer.com/" target="_blank">SoftLayer</a> innovation labs which aims to bridge the gap between <a href="http://api.openstack.org/api-ref.html" target="_blank">OpenStack native APIs</a> and other proprietary vendor APIs -- an API adapter proxy if you will. Jumpgate is implemented in the Python programming language as a WSGI application and thus runs as a web based service. </span><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">As a fully compliant python </span><a href="http://wsgi.readthedocs.org/en/latest/what.html" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;" target="_blank">WSGI</a><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"> application, Jumpgate can be hosted via a Python server such as </span><a href="http://gunicorn.org/" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;" target="_blank">gunicorn</a><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"> or fronted by your favorite web server with WSGI support such as </span><a href="http://httpd.apache.org/" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;" target="_blank">Apache</a><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"> with </span><a href="http://flask.pocoo.org/docs/deploying/mod_wsgi/" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;" target="_blank">mod WSGI</a><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"> or </span><a href="http://wiki.nginx.org/Main" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;" target="_blank">nginx</a><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"> with </span><a href="http://wiki.nginx.org/NgxWSGIModule" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;" target="_blank">NgxWSGIModule</a><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">. </span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">From an architectural perspective Jumpgate is stateless (no persistence) and lightweight making it easy to scale out suiting the needs of many deployment scenarios. Under the covers Jumpgate is pluggable, allowing you to easily snap-in or snap-out both request and response middleware "hooks" and service drivers.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Jumpgate request and response hooks permit you to write and plug-in Python code which can work with requests and responses as they enter / leave the Jumpgate application. For example you could easily implement a hook to support API rate limiting or fully featured request auditing. Out of the box Jumpgate includes a number of pre-built hooks including logging and authentication.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Jumpgate service drivers provide the functionality needed to translate OpenStack native API requests into native APIs requests and back again as OpenStack compliant responses. Think of these drivers as adapters. These drivers are pluggable per OpenStack service endpoint supported by Jumpgate -- image, compute, network, identity, etc.. </span><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">Out of the box Jumpgate provides a set of SoftLayer drivers which allow you use a number of OpenStack client side tools immediately with SoftLayer Jumpgate. It's also possible to implement and snap-in your own drivers to support bridging between OpenStack APIs and your native API.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">From an identity perspective, Jumpgate also includes a number of other plug points providing maximum flexibility for your solution needs. For example the <a href="http://docs.openstack.org/grizzly/openstack-compute/install/apt/content/elements-of-keystone-service-catalog-entry.html" target="_blank">Keystone compliant service catalog</a> served by Jumpgate is based on a template file which look much like the <a href="https://github.com/openstack/keystone/blob/master/etc/default_catalog.templates" target="_blank">Keystone default catalog</a>. These endpoints can be modified to suit your needs and you can also plug in other remote service endpoints you wish Jumpgate to expose in the service catalog. Jumpgate also includes pluggable token and authentication drivers allowing you to control how authentication requests are fulfilled, as well as how tokens are structured, encoded and decoded.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">The diagram below depicts the high level architecture of Jumpgate. On the left side of the diagram the generic form of Jumpgate is illustrated whereas on the right the SoftLayer specific drivers which realize the bridge are shown. You can also check out <a href="http://blog.softlayer.com/2014/building-bridge-openstack-api" target="_blank">Nathan Beittenmiller's SoftLayer blog on Jumpgate</a>.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitEVyYBUJYJtlEJb8jTFUt09RQnSJqlDG_egLm_04k3yQwdAMmEWLF67876dZThVUV2D4pQZp_sCaw14Pmy68Y_4AnalSOW8e1Hgdz3TYHwCqtycLdNLWSodUKcc2LU2vXcffa2xeNxZE/s1600/softlayer-jumpgate-architecture.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="SoftLayer Jumpgate architecture" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitEVyYBUJYJtlEJb8jTFUt09RQnSJqlDG_egLm_04k3yQwdAMmEWLF67876dZThVUV2D4pQZp_sCaw14Pmy68Y_4AnalSOW8e1Hgdz3TYHwCqtycLdNLWSodUKcc2LU2vXcffa2xeNxZE/s1600/softlayer-jumpgate-architecture.png" height="377" title="SoftLayer Jumpgate architecture" width="400" /></a></div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">From a development perspective, Jumpgate is a young active project which is growing / enhanced daily. As such, not each and every OpenStack API is supported with the out of the box SoftLayer drivers today. Instead, the most common OpenStack APIs were selected and initially implemented with additional APIs being added incrementally until the bridge is sufficiently supported. For a more complete list of the APIs supported, see the "compatibility matrix" on the <a href="http://softlayer.github.io/jumpgate/developer-guide/" target="_blank">Jumpgate developers page</a>. That being said, please do <a href="https://github.com/softlayer/jumpgate/issues?state=open" target="_blank">file issues</a> if you run into any bugs or if you have feature requests. Moreover, we are always looking for contributions so if you are feeling Pythonic please help out by following the <a href="https://github.com/softlayer/jumpgate/blob/master/CONTRIBUTING.rst" target="_blank">contributors guide</a>.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Let's now move to the hands-on instructions and get Jumpgate running.</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h2>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Installing & Setting up Jumpgate</span></h2>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">For this guide we'll be setting up Jumpgate and related components on a SoftLayer Cloud Computing Instance (CCI) which is running the Ubunutu 12.04 Operating System. However, you could just as easily provision Jumpgate off-premise SoftLayer as the <a href="http://sldn.softlayer.com/article/SoftLayer-API-Overview" target="_blank">SoftLayer API</a> (SLAPI) endpoint is public facing and reachable over the public network. Moreover a number of the exact commands shown here are Ubuntu specific (i.e. </span><span style="font-family: Courier New, Courier, monospace;">apt-get</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">, </span><span style="font-family: Courier New, Courier, monospace;">initctl</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">, etc.), but they can easily be translated into your distro of choice.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">In the steps that follow I will provide snippets from my terminal which include my shell prompt, followed by the exact command(s) run. I will also show an abbreviated section of the command's output using "</span><span style="font-family: Courier New, Courier, monospace;">...</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">" to indicate additional output is removed for brevity. I tend run multiple commands on a single line using the bash </span><span style="font-family: Courier New, Courier, monospace;">&&</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> operator. This operator can be used to chain multiple commands on a single line and indicates </span><span style="font-family: Courier New, Courier, monospace;">bash</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> should execute the commands left-to-right, one-by-one only running subsequent commands in the chain if the previous executes successfully. If a command should fail, you can address the failure and run the remaining commands one-by-one. Finally I'm performing all steps in this guide as a non-root user and thus use </span><span style="font-family: Courier New, Courier, monospace;">sudo</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> to execute commands as root.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Jumpgate is now containerized for docker</span></h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">As of June 27th, 2014, a docker based image for Jumpgate has been published to <a href="https://registry.hub.docker.com/u/bodenr/jumpgate/" target="_blank">dockerhub</a>. This image allows you to run Jumgpate as a docker container in a single command and encapsulates all the manual setup you need to complete with installing and configuring Jumpgate.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Before you begin</span></h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">In order to prepare for the Jumpgate installation and setup, take a moment to consider the topology you wish to realize with this solution. In particular consider the following questions:</span><br />
<br />
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Will the components consuming Jumpgate be located on the same host as Jumpgate, or will they be remote?</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">If the components consuming Jumpgate are remote, which IP / interface will they be using to communicate with Jumpgate?</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Which port will Jumpgate bind to on your host system? If you are planning to run OpenStack Keystone on the same system using Keystone's default ports, you will need to select a different open port for Jumpgate to bind on.</span></li>
</ul>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">As a result of the questions above, you will need to determine the IP address Jumpgate will bind and listen on. If your solution will always have the Jumpgate consumers on the same host, you may choose to bind Jumpgate to the loopback IP of your host (localhost, 127.0.0.1) and thus not expose it externally. However if your Jumpgate consumers will be remote, you may want to restrict their access to the private IP of your host in which case Jumpgate would bind to the private IP / network.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">The IP address you wish to bind Jumpgate on is referred to as the </span><span style="font-family: Courier New, Courier, monospace;">JUMPGATE_IP</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> in the instructions below. Any place you see </span><span style="font-family: Courier New, Courier, monospace;">JUMPGATE_IP</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">, substitute the IP Jumpgate will bind to.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Likewise the port you will bind Jumpgate to is referred to as </span><span style="font-family: Courier New, Courier, monospace;">JUMPGATE_PORT</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> below. Substitute your selected Jumpgate bind port accordingly.</span><br />
<br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Install Prerequisites</span></h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">The first thing we need to do is to install some prerequisites (dependencies) needed by Jumpgate and it's python requirements. Note that <a href="https://help.ubuntu.com/10.04/serverguide/NTP.html" target="_blank">NTP</a> is not required by Jumpgate, but my preference is to keep server times in sync and thus I illustrate its setup here.</span><br />
<pre style="-webkit-text-stroke-width: 0px; background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 19px; margin: 15px 0px; orphans: auto; overflow: auto; padding: 6px 10px; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; white-space: pre; word-wrap: normal;"><span style="color: #4c1130; font-weight: normal;">boden@jumpstack:~$</span><span style="color: #0c343d; font-weight: normal;"> </span><b>sudo apt-get update && sudo apt-get install -y gcc git python-pip gunicorn python-dev ntp</b><span style="color: #333333;">
</span><span style="color: #999999;">Hit http://mirrors.service.networklayer.com precise Release.gpg
Hit http://mirrors.service.networklayer.com precise-updates Release.gpg
...
ldconfig deferred processing now taking place
Processing triggers for python-support ...</span></code></pre>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Configure NTP for SoftLayer</span></h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Now we'll configure the NTP service on our system by pointing it to the SoftLayer time server which is available on the private SoftLayer network. If you're configuring Jumpgate off-premise SoftLayer (without a private link to SoftLayer's network) you'll want to substitute the SoftLayer fully qualified hostname for a NTP sever reachable from your host. More details on SoftLayer's time service can be found on the <a href="http://blog.softlayer.com/2009/1234567890" target="_blank">SoftLayer blog</a>.</span><br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><span style="color: #4c1130;">boden@jumpstack:~$</span><span style="color: #333333;"> </span><b>sudo sed -i '/server/ s/^/# /' /etc/ntp.conf && echo "server servertime.service.softlayer.com" | sudo tee -a /etc/ntp.conf && sudo service ntp restart
</b><span style="color: #999999;">server servertime.service.softlayer.com
* Stopping NTP server ntpd [ OK ]
* Starting NTP server ntpd [ OK ]</span></code></pre>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Update Python pip</span></h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Earlier we installed python </span><span style="font-family: Courier New, Courier, monospace;">pip</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> using </span><span style="font-family: Courier New, Courier, monospace;">apt-get</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">. However the version of pip installed in that step is not the latest. As some python dependencies require the later versions of setuptools which is included with pip, we'll manually upgrade pip in this step to get the latest version.</span><br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><span style="color: #4c1130;">boden@jumpstack:~$</span><span style="color: #333333;"> </span><b>sudo pip install --upgrade pip</b><span style="color: #333333;">
</span><span style="color: #999999;">Downloading/unpacking pip
Running setup.py egg_info for package pip
...
Successfully installed pip
Cleaning up...</span><span style="color: #333333;">
</span></code></pre>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Clone the Jumpgate source code</span></h3>
<div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">We are now ready to get rolling with Jumpgate installation. Since we are installing Jumpgate from source we first need to use git to clone the github repo.</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> For this guide I have chosen </span><span style="font-family: Courier New, Courier, monospace;">/usr/local/</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> as the root directory for the source.</span></div>
<div>
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><span style="color: #4c1130;">boden@jumpstack:~$</span><span style="color: #333333;"> </span><b>cd /usr/local/ && sudo git clone https://github.com/softlayer/jumpgate.git</b><span style="color: #333333;">
</span><span style="color: #999999;">Cloning into 'jumpgate'...
remote: Reusing existing pack: 3229, done.
remote: Counting objects: 13, done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 3242 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3242/3242), 13.40 MiB | 15.16 MiB/s, done.
Resolving deltas: 100% (1749/1749), done.</span></code></pre>
</div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Install Jumpgate Python Requirements</span></h3>
<div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Python based projects often have dependencies on other python libraries / modules. Such dependencies are often times explicitly expressed using a 'requirements' file which lists all the py dependencies and optionally and version requirements per dependency (e.g. module foo requires module bar > 1.1).</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">We will use the </span><span style="font-family: Courier New, Courier, monospace;">pip</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> command to install Jumpgate's python requirements from file. These requirements are defined in the </span><span style="font-family: Courier New, Courier, monospace;">tools/requirements.txt</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> file within the Jumpgate source code project.</span></div>
<div>
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><span style="color: #4c1130;">boden@jumpstack:/usr/local$</span><span style="color: #333333;"> </span><b>cd /usr/local/jumpgate && sudo pip install -r tools/requirements.txt</b><span style="color: #333333;">
</span><span style="color: #999999;">Downloading/unpacking falcon>=0.1.8 (from -r tools/requirements.txt (line 1))
Downloading falcon-0.1.8-py2.py3-none-any.whl (91kB): 91kB downloaded
...
Successfully installed falcon requests six oslo.config softlayer pycrypto iso8601 python-mimeparse prettytable docopt
Cleaning up...</span></code></pre>
</div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Install Jumpgate</span></h3>
<div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">We're now ready to install the Jumpgate python code itself. </span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">We'll </span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">use the standard python means of installing a project using the </span><span style="font-family: Courier New, Courier, monospace;">setup.py</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> included with the project.</span></div>
<div>
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><span style="color: #4c1130;">boden@jumpstack:/usr/local/jumpgate$</span><span style="color: #333333;"> </span><b>sudo python setup.py install</b><span style="color: #333333;">
</span><span style="color: #999999;">running install
Checking .pth file support in /usr/local/lib/python2.7/dist-packages/
...
Using /usr/local/lib/python2.7/dist-packages
Finished processing dependencies for jumpgate==0.1</span></code></pre>
</div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Create a service user and group</span></h3>
<div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">For this guide I've chosen to setup Jumpgate as a service which can be managed via Ubuntu's <a href="http://upstart.ubuntu.com/" target="_blank">upstart</a>. Using upstart you can manage jumgpate as an actual service including automatic start-up of the service on Operating System boot. My preference is to not run services as root unless absolutely necessary and thus I'll be creating a new group called </span><span style="font-family: Courier New, Courier, monospace;">srv</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> and a service user to run Jumpgate called </span><span style="font-family: Courier New, Courier, monospace;">jumpgate</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">.</span></div>
<div>
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><span style="color: #4c1130;">boden@jumpstack:/usr/local/jumpgate$</span><span style="color: #333333;"> </span><b>sudo addgroup srv && sudo useradd -r -g srv jumpgate</b><span style="color: #333333;">
</span><span style="color: #999999;">Adding group `srv' (GID 1001) ...
Done.</span></code></pre>
</div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Setup an etc directory for Jumpgate</span></h3>
<div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Jumpgate requires a few configuration files which allow you define properties for Jumpgate's runtime behavior. Rather than using / referencing the configuration files under the Jumpgate source directly, we'll create an </span><span style="font-family: Courier New, Courier, monospace;">/etc</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> directory for them in accordance with the standard file system layout for Linux applications.</span></div>
<div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span></div>
<div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">First, let's create an etc directory for Jumpgate and setup the directory permissions:</span></div>
<div>
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><span style="color: #4c1130;">boden@jumpstack:/usr/local/jumpgate$</span><span style="color: #333333;"> </span><b>sudo mkdir /etc/jumpgate && sudo chown jumpgate:srv /etc/jumpgate</b></code></pre>
</div>
<div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Now let's copy the Jumpgate configuration files from the source project into the etc directory and change the permissions:</span></div>
<div>
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><span style="color: #4c1130;">boden@jumpstack:/usr/local/jumpgate$</span><span style="color: #333333;"> </span><b>sudo cp /usr/local/jumpgate/etc/* /etc/jumpgate && sudo chown jumpgate:srv /etc/jumpgate/* && sudo chmod 640 /etc/jumpgate/*</b></code></pre>
</div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Configure Jumpgate identity templates</span></h3>
<div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">As Jumpgate provides a set of OpenStack Keystone compliant identity APIs, it must also host the <a href="http://docs.openstack.org/havana/install-guide/install/apt/content/keystone-services.html" target="_blank">service catalog</a> which defines the service endpoints available to consumers of the API. Jumpgate allows configurable service endpoints via it's </span><span style="font-family: Courier New, Courier, monospace;">identity.templates</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> file similar to how OpenStack Keystone's <a href="https://github.com/openstack/keystone/blob/master/etc/default_catalog.templates">default_catalog.templates</a> works. In this file you can define the services and their endpoints as returned in a Jumpgate identity catalog based response (such as a successful response to obtain a token).</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">By default these endpoints refer to </span><span style="font-family: Courier New, Courier, monospace;">localhost </span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">and port </span><span style="font-family: Courier New, Courier, monospace;">5000</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> which is the default bind address / port for Jumpgate. However as discussed in the 'before you begin' section you may need to change these based on your desired topology.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Keep in mind these endpoint services and URLs will be followed by OpenStack compliant tooling such as the CLIs. Therefore the host / port should refer to Jumpgate bind address / port itself. Moreover note if you were developing a solution using other OpenStack services, you could define their service and endpoint in the catalog file to serve them from Jumpgate's identity catalog. In this case you would use the base URI to the service you are integrating.</span></div>
<div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">First replace </span><span style="font-family: Courier New, Courier, monospace;">localhost</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> with the IP you are binding Jumpgate on (remember to substitute </span><span style="font-family: Courier New, Courier, monospace;">JUMPGATE_IP</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> in the command below with the IP you want Jumpgate on).</span><br />
<br />
<blockquote style="-webkit-text-stroke-width: 0px; background-color: white; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 4px; box-sizing: border-box; color: #777777; font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25.5px; margin: 15px 0px; orphans: auto; padding: 0px 15px; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;">
</blockquote>
<br />
<pre style="-webkit-text-stroke-width: 0px; background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 19px; margin: 15px 0px; orphans: auto; overflow: auto; padding: 6px 10px; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; white-space: pre; word-wrap: normal;"><span style="color: #4c1130; font-weight: normal;">boden@jumpstack:/usr/local/jumpgate$</span><span style="color: #333333;"> </span><b>sudo sed -i 's/localhost/JUMPGATE_IP/g' /etc/jumpgate/identity.templates</b><span style="color: #333333;">
</span></code></pre>
</div>
<div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Next replace the usage of port </span><span style="font-family: Courier New, Courier, monospace;">5000</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> with the port you wish to bind Jumpgate on (remember to substitute </span><span style="font-family: Courier New, Courier, monospace;">JUMPGATE_PORT</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> in the command below with the port you want Jumgpate to listen on).</span><br />
<br />
<blockquote style="-webkit-text-stroke-width: 0px; background-color: white; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 4px; box-sizing: border-box; color: #777777; font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25.5px; margin: 15px 0px; orphans: auto; padding: 0px 15px; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;">
</blockquote>
<br />
<pre style="-webkit-text-stroke-width: 0px; background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 19px; margin: 15px 0px; orphans: auto; overflow: auto; padding: 6px 10px; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; white-space: pre; word-wrap: normal;"><span style="color: #4c1130; font-weight: normal;">boden@jumpstack:/usr/local/jumpgate$</span><span style="color: #333333;"> </span><b>sudo sed -i 's/5000/JUMPGATE_PORT/g' /etc/jumpgate/identity.templates</b><span style="color: #333333;">
</span></code></pre>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Setup Jumpgate configuration file</span></h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">We are now ready to setup the jumpgate configuration file which defines various properties to control Jumpgate's runtime behavior. Jumpgate uses a standard ini formatted file just like all OpenStack proper services. There are a handful of properties you can change in this file, but for this sample we'll only edit the few necessary to get our demo working.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">First we'll replace all usage of the loopback address (</span><span style="font-family: Courier New, Courier, monospace;">127.0.0.1</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">) with the IP address we want Jumpgate bound on. You can do this manually using your favorite editor, or you can use the 1-liner below to do it for you. Remember to replace the usage of </span><span style="font-family: Courier New, Courier, monospace;">JUMPGATE_IP</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> in the command below with the IP address you want Jumpgate to listen on.</span><br />
<pre style="-webkit-text-stroke-width: 0px; background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 19px; margin: 15px 0px; orphans: auto; overflow: auto; padding: 6px 10px; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; white-space: pre; word-wrap: normal;"><span style="color: #4c1130; font-weight: normal;">boden@jumpstack:/usr/local/jumpgate$</span><span style="color: #333333;"> </span><b>sudo sed -i 's/127.0.0.1/JUMPGATE_IP/g' /etc/jumpgate/jumpgate.conf</b><span style="color: #333333;">
</span></code></pre>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">We now need to setup an 'admin token' and 'secret key' for Jumpgate. The admin token is similar to OpenStack Keystone's admin token in that it can be used as the </span><span style="font-family: Courier New, Courier, monospace;">X-Auth-Token</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> header value to gain authenticated access to Jumpgate -- think of this token as a special password for Jumpgate. Note that using this admin token does not signify you have access to the 'backend' API's Jumpgate is integrating with. Rather it signifies you can authenticate with Jumpgates authentication middleware permitting you to access the API controllers in Jumpgate.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Jumpgate contains a set of pluggable identity drivers which permit you to easily write and plug-in your own authentication, token and token encryption schemes. By default Jumpgate uses AES encryption to encrypt / decrypt the authentication token IDs it generates for it's identity driver. This AES support requires an AES key to seed the algorithm -- this is the 'secret key'. For this sample we'll generate a 16 char key, but feel free to generate your own AES compliant key and use it.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Here's one way to generate a random 16 character key:</span><br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><b>date +%s | sha256sum | base64 | head -c 16 ; echo</b></code></pre>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">The output from the command above can be used as the </span><span style="font-family: Courier New, Courier, monospace;">SECRET_KEY</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> shown below.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">We now need to edit the </span><span style="font-family: Courier New, Courier, monospace;">/etc/jumpgate/jumpgate.conf</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> using your favorite editor (note if you are not running as root you'll need to use </span><span style="font-family: Courier New, Courier, monospace;">sudo</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> to edit the file) and set the </span><span style="font-family: Courier New, Courier, monospace;">secret_key</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> and </span><span style="font-family: Courier New, Courier, monospace;">admin_token</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> values. Again the secret key is a valid AES key, and admin token is a random string of your choice. Below is a sample snippet of the conf file after it has been updated. Save the file once you have edited it.</span><br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><b>[DEFAULT]
enabled_services = identity, compute, image, block_storage, network, baremetal
log_level = INFO
admin_token = X9ma11x9aj00em
secret_key = M2UzYzYzZDdmMzQx
request_hooks = jumpgate.common.hooks.admin_token, jumpgate.common.hooks.auth_token, jumpgate.common.hooks.sl.client
response_hooks = jumpgate.common.hooks.log</b></code></pre>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Create a Jumpgate upstart job</span></h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">To ease management of Jumpgate as a service and enable features such as auto-start at Operating System boot time, we will create an upstart job. <a href="http://upstart.ubuntu.com/">Upstart</a> is Ubuntu's init daemon and requires you to create a conf file to define a job. Using your favorite editor, create the file </span><span style="font-family: Courier New, Courier, monospace;">/etc/init/jumpgate.conf</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> with the contents shown below. Note - you may need to use </span><span style="font-family: Courier New, Courier, monospace;">sudo</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> to edit the file you do not have proper authority. Also remember to replace </span><span style="font-family: Courier New, Courier, monospace;">JUMPGATE_IP</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> and </span><span style="font-family: Courier New, Courier, monospace;">JUMPGATE_PORT</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> with the IP address and port respectively Jumpgate will listen on.</span><br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><b># A simple library to make more clouds compatible with OpenStack
description "Jumpgate"
setuid jumpgate
start on (filesystem and net-device-up IFACE!=lo)
stop on runlevel [016]
script
export JUMPGATE_CONFIG=/etc/jumpgate/jumpgate.conf
exec gunicorn "jumpgate.wsgi:make_api()" --bind="JUMPGATE_IP:JUMPGATE_PORT" --timeout=600 --access-logfile="-" -w 4 $@;
end script</b></code></pre>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">This conf definition sets up the logic necessary to manage Jumpgate via upstart. As you can see in the definition, we kick-off the gunicorn processes the runs the Jumpgate WSGI application as the </span><span style="font-family: Courier New, Courier, monospace;">jumpgate</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> user. This job will auto-start on system boot after the filesystem and network interface becomes active.</span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Start Jumpgate</span></h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">We are now ready to fire-up the Jumpgate job using <a href="http://manpages.ubuntu.com/manpages/quantal/en/man8/initctl.8.html" target="_blank">initctl</a>.</span><br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><span style="color: #4c1130;">boden@jumpstack:/usr/local/jumpgate$</span><span style="color: #333333;"> </span><b>sudo initctl start jumpgate</b><span style="color: #333333;">
</span><span style="color: #999999;">jumpgate start/running, process 15791</span></code></pre>
</div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">If you want to double-check that jumpgate is running you can use the initctl status command as shown below:</span><br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><span style="color: #4c1130;">boden@jumpstack:/usr/local/jumpgate$</span><span style="color: #333333;"> </span><b>sudo initctl status jumpgate</b><span style="color: #333333;">
</span><span style="color: #999999;">jumpgate start/running, process 15791</span></code></pre>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h2>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Testing Jumpgate with OpenStack nova client</span></h2>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">At this point Jumpgate should be running and ready for action. To test it out and also demonstrate how you can use the OpenStack tools with Jumpgate, let's install OpenStack nova client and perform some operations.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Clone nova client source</span></h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">We will be installing nova client from source and thus we need to clone it's github repo. For many Linux distros native packages exist which permit you to install nova client and other OpenStack components with you package manager. However my preference is to use the latest source, so let's get on with it and clone the repo.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><span style="color: #4c1130;">boden@jumpstack:/usr/local/jumpgate$</span><span style="color: #333333;"> </span><b>cd /usr/local && sudo git clone https://github.com/openstack/python-novaclient.git</b><span style="color: #333333;">
</span><span style="color: #999999;">Cloning into 'python-novaclient'...
remote: Reusing existing pack: 9802, done.
remote: Counting objects: 55, done.
remote: Compressing objects: 100% (53/53), done.
remote: Total 9857 (delta 28), reused 8 (delta 2)
Receiving objects: 100% (9857/9857), 3.45 MiB, done.
Resolving deltas: 100% (6793/6793), done.</span></code></pre>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Install nova client dependencies</span></h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Just as we did when installing Jumpgate from source, we now need to install nova client's python based dependencies based on its </span><span style="font-family: Courier New, Courier, monospace;">requirements.txt</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> file. The command to do so is shown below.</span><br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><span style="color: #4c1130;">boden@jumpstack:/usr/local$</span><span style="color: #333333;"> </span><b>cd /usr/local/python-novaclient && sudo pip install -r requirements.txt</b><span style="color: #333333;">
</span><span style="color: #999999;">Downloading/unpacking pbr>=0.6,<1.0 (from -r requirements.txt (line 1))
Downloading pbr-0.7.0.tar.gz (78kB): 78kB downloaded
...
Successfully installed pbr simplejson Babel pytz
Cleaning up...</span></code></pre>
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Install nova client</span></h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">We are now ready to install the nova client python source. To do so we'll follow the same process we did for Jumpgate by running the </span><span style="font-family: Courier New, Courier, monospace;">setup.py</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> script.</span><br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><span style="color: #4c1130;">boden@jumpstack:/usr/local/python-novaclient$</span><span style="color: #333333;"> </span><b>sudo python setup.py install</b><span style="color: #333333;">
</span><span style="color: #999999;">running install
Requirement already satisfied (use --upgrade to upgrade): pbr>=0.6,<1.0 in /usr/local/lib/python2.7/dist-packages
Requirement already satisfied (use --upgrade to upgrade): iso8601>=0.1.9 in /usr/local/lib/python2.7/dist-packages
Requirement already satisfied (use --upgrade to upgrade): PrettyTable>=0.7,<0.8 in /usr/local/lib/python2.7/dist-packages
...
running install_scripts
Installing nova script to /usr/local/bin</span></code></pre>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Setting up your variables for use with nova client</span></h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">We're ready to start working with nova client, but we first need to collect the variables we need to authenticate with Jumpgate. Just as with any other OpenStack client / service we need the following information:</span><br />
<br />
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Authentication URL --- This is the base endpoint URI to the Keystone compatible service which provides the identity APIs for the deployment. In our case this is the identity URI of Jumpgate as Jumpgate is serving as Keystone here.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Username -- Your username which serves as your identity in the authentication protocol implemented by the Keystone compatible service. Here we are using Jumpgate to bridge into SoftLayer and thus we'll our username we provide when logging into the SoftLayer portal.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Password -- The password associated with the username for SoftLayer. In this case we can use our SoftLayer password or API key. A SoftLayer API key can be obtained from the user management portion of the SoftLayer web portal. For more details on the SoftLayer API key see the <a href="http://knowledgelayer.softlayer.com/procedure/retrieve-your-api-key" target="_blank">SoftLayer documentation</a>.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Tenant -- The project (aka tenant) your user belongs to. Here again since we are bridging into SoftLayer our tenant ID is our account ID in SoftLayer. Your account ID is shown in the upper right-hand corner of the <a href="https://control.softlayer.com/" target="_blank">new SoftLayer web dashboard</a> and is typically a 6 digit number.</span></li>
</ul>
<br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Now that we have the required identity information, we can use these values with nova client (or any other OpenStack client we use with Jumpgate). My preferred way of setting these is to define them as env vars in a file which can then be sourced. Using this approach you do not need to specify these values as parameters on each invocation of the CLI. For more details on the env vars for OpenStack env vars, see the <a href="http://docs.openstack.org/user-guide/content/cli_openrc.html" target="_blank">OpenStack documentation</a>.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Create new file in your home directory such as </span><span style="font-family: Courier New, Courier, monospace;">~/jumprc</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> and add the contents shown below. Substitute the following values:</span><br />
<br />
<ul>
<li><span style="font-family: Courier New, Courier, monospace;">JUMPGATE_IP</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> -- The IP address of Jumpgate.</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">JUMPGATE_PORT</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> -- The port Jumpgate is listening on.</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">YOUR_SOFTLAYER_API_KEY</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> -- Your SoftLayer password or API key.</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">YOUR_SOFTLAYER_ACCOUNT_ID</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> -- Your SoftLayer account ID.</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">YOUR_SOFTLAYER_USER_ID</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> -- The ID you use to log into the SoftLayer web portal.</span></li>
</ul>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><b>export OS_AUTH_URL=http://JUMPGATE_IP:JUMPGATE_PORT/v2.0
export OS_PASSWORD=YOUR_SOFTLAYER_API_KEY
export OS_TENANT_ID=YOUR_SOFTLAYER_ACCOUNT_ID
export OS_USERNAME=YOUR_SOFTLAYER_USER_ID</b></code></pre>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">With those variables defined you can source them into your current shell as shown below. Or if you want them active upon login, put them into </span><span style="font-family: Courier New, Courier, monospace;">~/.bashrc </span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">or its equivalent.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><span style="color: #4c1130;">boden@jumpstack:~$</span><span style="color: #333333;"> </span><b>source ~/jumprc</b></code></pre>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Using nova CLI with Jumpgate</span></h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">We're ready to start using the nova CLI with Jumpgate. Let's first determine the availability zones Jumpgate exposes:</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><span style="color: #4c1130;">boden@jumpstack:~$</span><span style="color: #333333;"> </span><b>nova availability-zone-list</b><span style="color: #333333;">
</span><span style="color: #999999;">+-------+-----------+
| Name | Status |
+-------+-----------+
| ams01 | available |
| dal01 | available |
| dal05 | available |
| dal06 | available |
| sea01 | available |
| sjc01 | available |
| sng01 | available |
| wdc01 | available |
+-------+-----------+</span></code></pre>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">As you can see in the output above, Jumpgate at the time of this writing exposes each of SoftLayer's Data Centers as it's own availability zone. Thus when you are working with OpenStack CLIs which accept an availability zone you can specify the appropriate availability zone as desired.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Let's now use the nova CLI to find an image. For this demo let's locate a Ubuntu image to deploy in SoftLayer:</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><span style="color: #4c1130;">boden@jumpstack:~$</span><span style="color: #333333;"> </span><b>nova image-list | grep ubuntu</b><span style="color: #333333;">
</span><span style="color: #999999;">| 7a938011-a7c2-4e4e-9394-4c6456a24d07 | frozen.ubuntu.storage.2013/06/25 | active | |
| 85aa5ba5-4944-43ea-99ac-19de6dd180dc | frozen.ubuntu.storage.2013/10/14 | active | |
| 6c382582-4ec6-40f2-8d61-4732d1cf8997 | frozen.ubuntu.storage.2013/12/08</span><span style="color: #333333;"> </span></code></pre>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">As you can see in the output above, we've grepped out a few Ubuntu based images. The images exposed via Jumpgate correspond to SoftLayer image templates available to your account in SoftLayer.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Let's now list all the flavors known to Jumpgate:</span><br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><span style="color: #4c1130;">boden@jumpstack:~$ </span><b>nova flavor-list</b><span style="color: #333333;">
</span><span style="color: #999999;">+----+------------------------+-----------+------+-----------+------+-------+-------------+-----------+
| ID | Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public |
+----+------------------------+-----------+------+-----------+------+-------+-------------+-----------+
| 1 | 1 vCPU, 1GB ram, 25GB | 1024 | 25 | 0 | | 1 | 1 | True |
| 2 | 1 vCPU, 1GB ram, 100GB | 1024 | 100 | 0 | | 1 | 1 | True |
| 3 | 2 vCPU, 2GB ram, 100GB | 2048 | 100 | 0 | | 2 | 1 | True |
| 4 | 4 vCPU, 4GB ram, 100GB | 4096 | 100 | 0 | | 4 | 1 | True |
| 5 | 8 vCPU, 8GB ram, 100GB | 8192 | 100 | 0 | | 8 | 1 | True |
+----+------------------------+-----------+------+-----------+------+-------+-------------+-----------+</span></code></pre>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">At the time of this writing Jumpgate exposes the most common configurations you might specify when provisioning a Cloud Computing Instance (CCI) via SoftLayer. These values correspond to the memory, CPU and disk options you have available when you create a CCI in the SoftLayer web portal.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">If you're familiar with the SoftLayer CCI provisioning options you'll quickly realize there are substantially more configuration combinations available via the SoftLayer web dashboard. Jumpgate does not currently account for them all, but rather exposes those which are most common. Also (at the time of this writing) all the disk configurations correspond to LOCAL disk types. In the future we hope to support SAN based disks as well.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Let's now use the nova CLI to boot 2 instances. For the first instance we'll specify the Washington DC SoftLayer Data Center by specifying the </span><span style="font-family: Courier New, Courier, monospace;">wdc01</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> availability zone. The second instance we'll launch in the Dallas 01 Data Center by specifying the </span><span style="font-family: Courier New, Courier, monospace;">dal01</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> availability zone. Both instances will boot from one of the Ubuntu images we listed above and both will also use flavor 3. If you're familiar with the nova CLI none of this should be new to you -- the only difference here is that we are ultimately specifying virtual server attributes to use with our CCI which is realized via the adapter drivers in Jumpgate.</span><br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><span style="color: #4c1130;">boden@jumpstack:~$</span><span style="color: #333333;"> </span><b>nova boot --flavor 3 --image 7a938011-a7c2-4e4e-9394-4c6456a24d07 --availability-zone wdc01 nova-jumpgate-wdc</b><span style="color: #333333;">
</span><span style="color: #999999;">+-----------------------------+-------------------------------------------------------------------------+
| Property | Value |
+-----------------------------+-------------------------------------------------------------------------+
| OS-EXT-AZ:availability_zone | - |
| OS-EXT-STS:power_state | 2 |
| OS-EXT-STS:task_state | - |
| OS-EXT-STS:vm_state | ACTIVE |
| accessIPv4 | |
| accessIPv6 | |
| adminPass | |
| created | 2014-03-22T12:18:54-06:00 |
| flavor | 1 vCPU, 1GB ram, 25GB (1) |
| hostId | 3979784 |
| id | 3979784 |
| image | frozen.ubuntu.storage.2013/06/25 (7a938011-a7c2-4e4e-9394-4c6456a24d07) |
| image_name | |
| name | nova-jumpgate-wdc |
| security_groups | default |
| status | SHUTOFF |
| tenant_id | 278184 |
| updated | |
| user_id | - |
+-----------------------------+-------------------------------------------------------------------------+
</span><span style="color: #4c1130;">boden@jumpstack:~$</span><span style="color: #999999;"> </span><b>nova boot --flavor 3 --image 7a938011-a7c2-4e4e-9394-4c6456a24d07 --availability-zone dal01 nova-jumpgate-dal</b><span style="color: #999999;">
+-----------------------------+-------------------------------------------------------------------------+
| Property | Value |
+-----------------------------+-------------------------------------------------------------------------+
| OS-EXT-AZ:availability_zone | - |
| OS-EXT-STS:power_state | 2 |
| OS-EXT-STS:task_state | - |
| OS-EXT-STS:vm_state | ACTIVE |
| accessIPv4 | |
| accessIPv6 | |
| adminPass | |
| created | 2014-03-22T12:19:15-06:00 |
| flavor | 1 vCPU, 1GB ram, 25GB (1) |
| hostId | 3979788 |
| id | 3979788 |
| image | frozen.ubuntu.storage.2013/06/25 (7a938011-a7c2-4e4e-9394-4c6456a24d07) |
| image_name | |
| name | nova-jumpgate-dal |
| security_groups | default |
| status | SHUTOFF |
| tenant_id | 278184 |
| updated | |
| user_id | - |
+-----------------------------+-------------------------------------------------------------------------+</span></code></pre>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">We can now head out to the SoftLayer web dashboard to verify our servers are booting (see snapshot below). You can obviously also use the nova CLI to query their status as well.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidivcsZvAZBuidiHoTaK_Y5PAC2gLEUWlj35jaoOzDEOia6AyTUELIUQcNbd-1Xo8tgssMwKoxPC-W3M1y7NyQ3Icu5bNBoQtTNKTi3lQhENOe57PtGKzC3L784eoPhwkEOx4-yDYtuTk/s1600/jumpgate-nova-boot-in-az.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img alt="OpenStack nova initiated virtual servers in SoftLayer web-based dashboard" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidivcsZvAZBuidiHoTaK_Y5PAC2gLEUWlj35jaoOzDEOia6AyTUELIUQcNbd-1Xo8tgssMwKoxPC-W3M1y7NyQ3Icu5bNBoQtTNKTi3lQhENOe57PtGKzC3L784eoPhwkEOx4-yDYtuTk/s1600/jumpgate-nova-boot-in-az.png" height="164" title="OpenStack nova initiated virtual servers in SoftLayer web-based dashboard" width="640" /></a><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Many other operations are available using the nova CLI with Jumpgate, but we don't have time to cover them all here. To determine what's supported via Jumpgate please consult the compatibility matrix in the <a href="http://softlayer.github.io/jumpgate/developer-guide/" target="_blank">Jumpgate documentation</a>. Moreover you can use other OpenStack clients with Jumpgate in the same fashion such as the glance CLI.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span><br />
<h2>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Using OpenStack Horizon dashboard with SoftLayer Jumpgate</span></h2>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Jumpgate also opens the door to managing SoftLayer resources using the OpenStack Horizon web-based dashboard. You can setup a dedicated Horizon installation to manage SoftLayer based resources with Jumpgate, or you can configure Horizon with multiple regions allowing you to manage multiple Clouds from a single pane of glass. As noted in the Jumpgate overview section, not all OpenStack APIs are supported through Jumpgate today and thus only a subset of the features in Horizon will work when managing SoftLayer resources through Jumpgate. Also note that if you have 10s or 100s of virtual servers in your SoftLayer account, Horizon will lag a bit when listing servers due to a <a href="https://github.com/softlayer/jumpgate/issues/72" target="_blank">bug in Jumpgate</a>. This Jumpgate issue will be fixed in the near future so hopefully by the time you try this out the lag will not exist.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">For this example I have an existing OpenStack deployment living in SoftLayer. I stood this deployment up using a basic <a href="http://devstack.org/" target="_blank">devstack</a> installation for demo purposes. In the steps that follow we'll setup Horizon to manage both my devstack deployment as well as SoftLayer via Jumpgate. </span><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">To do so we'll add Jumpgate as a separate region to Horizon which you can then log into using SoftLayer credentials and directly work with a subset of the SoftLayer resources such as CCIs, images, etc..</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Configure Jumpgate for Horizon</span></h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">In preparation for running Horizon, we must tweak some of the endpoints exposed by Jumpgate's service catalog. In particular:</span><br />
<br />
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">The image service needs to be served from it's base URI, not from the</span><span style="font-family: Courier New, Courier, monospace;"> /images</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> sub-URI which is used by default by Jumpgate. The reason for this is because the glance client is a bit picky in terms of what it can support for a base endpoint URI.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">The network service needs to be disabled as Jumpgate at the time of this writing does not support listing network extensions which is required by Horizon to discover the capabilities of the network service. We will be fixing this in Jumpgate -- see <a href="https://github.com/softlayer/jumpgate/issues/80" target="_blank">issue 80</a>.</span></li>
</ul>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Edit the</span><span style="font-family: Courier New, Courier, monospace;"> /etc/jumpgate/identity.templates</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> file using your favorite editor. You may need to use </span><span style="font-family: Courier New, Courier, monospace;">sudo</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> if you do not have the appropriate authority. Change the image URIs and comment out the networking service URIs as shown in the snippet below substituting </span><span style="font-family: Courier New, Courier, monospace;">JUMPGATE_IP</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> for your Jumpgate IP and </span><span style="font-family: Courier New, Courier, monospace;">JUMPGATE_PORT</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> for your Jumpgate port.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><b>catalog.RegionOne.image.name = Image Service
catalog.RegionOne.image.publicURL = http://JUMPGATE_HOST:JUMPGATE_PORT/
catalog.RegionOne.image.privateURL = http://JUMPGATE_HOST:JUMPGATE_PORT/
catalog.RegionOne.image.adminURL = http://JUMPGATE_HOST:JUMPGATE_PORT/
#catalog.RegionOne.network.name = Network Service
#catalog.RegionOne.network.publicURL = http://JUMPGATE_HOST:JUMPGATE_PORT/network/
#catalog.RegionOne.network.privateURL = http://JUMPGATE_HOST:JUMPGATE_PORT/network/
#catalog.RegionOne.network.adminURL = http://JUMPGATE_HOST:JUMPGATE_PORT/network/</b></code></pre>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">We now need to inform Jumpgate we are serving the image endpoint service from the base URI rather then under </span><span style="font-family: Courier New, Courier, monospace;">/images/</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">. To do so edit the </span><span style="font-family: Courier New, Courier, monospace;">/etc/jumpgate/jumgpate.conf</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> file in your favorite editor and add the mount property as shown below.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><b>[image]
driver=jumpgate.image.drivers.sl
mount = ""</b></code></pre>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Now restart jumpgate to pick up the changes:</span><br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><span style="color: #4c1130;">boden@jumpstack:~$</span><span style="color: #777777;"> </span><b>sudo initctl restart jumpgate</b><span style="color: #777777;">
</span><span style="color: #999999;">jumpgate start/running, process 27087</span></code></pre>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Setup Jumpgate as a region for Horizon</span></h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">For this demo, we'll assume you want to configure Horizon to support Jumpgate as a second region. This allows you to manage both your OpenStack deployment as well as Jumpgate SoftLayer from the same dashboard. As we'll see, this permits you to switch between management of SoftLayer via Jumpgate and management of your OpenStack deployment.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">On the system where Horizon is installed edit the </span><span style="background-color: white; font-family: 'Courier New', Courier, monospace; font-size: 15px; line-height: 25.5px;">horizon/openstack_dashboard/local/local_settings.py</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> file using your favorite editor. Locate the section of the file which defines the </span><span style="font-family: Courier New, Courier, monospace;">AVAILABLE_REGIONS</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> variable and add a tuple for your Jumpgate URI and a tuple for your OpenStack Keystone URI. This is fully documented in the <a href="http://docs.openstack.org/developer/horizon/topics/settings.html#available-regions" target="_blank">Horizon online docs</a>, but a sample is provided below fro this demo. Substitute </span><span style="font-family: Courier New, Courier, monospace;">JUMPGATE_IP</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> and </span><span style="font-family: Courier New, Courier, monospace;">JUMPGATE_PORT</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> for your Jumpgate IP address and port respectively and </span><span style="font-family: Courier New, Courier, monospace;">KEYSTONE_IP</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> and </span><span style="font-family: Courier New, Courier, monospace;">KEYSTONE_PORT</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> for your Keystone IP address and port.</span><br />
<span style="background-color: white; font-size: 15px; line-height: 25.5px;"></span><br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="n" style="box-sizing: border-box;">AVAILABLE_REGIONS</span> <span class="o" style="box-sizing: border-box; font-weight: bold;">=</span> <span class="p" style="box-sizing: border-box;">[(</span><span class="s" style="box-sizing: border-box; color: #dd1144;">'http://JUMPGATE_IP:JUMPGATE_PORT/v2.0'</span><span class="p" style="box-sizing: border-box;">,</span> <span class="s" style="box-sizing: border-box; color: #dd1144;">'SoftLayer'</span><span class="p" style="box-sizing: border-box;">),</span>
<span class="p" style="box-sizing: border-box;">(</span><span class="s" style="box-sizing: border-box; color: #dd1144;">'http://KEYSTONE_IP:KEYSTONE_PORT/v2.0'</span><span class="p" style="box-sizing: border-box;">,</span> <span class="s" style="box-sizing: border-box; color: #dd1144;">'OpenStack'</span><span class="p" style="box-sizing: border-box;">)]</span></pre>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">The above tells Horizon you have 2 regions, one named 'SoftLayer' which has an identity service at the given Jumpgate URI and one named 'OpenStack' which has a Keystone identity service as the specified URI.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">We now need to restart Horizon to pick up the changes. The method for restart will depend on how you have Horizon setup, but for apache based installations you can restart the </span><span style="font-family: Courier New, Courier, monospace;">apache2</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> service as shown below.</span><br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: inherit; margin: 0px; padding: 0px; vertical-align: middle; word-wrap: normal;"><span style="color: #4c1130;">boden@jumpstack:~$</span><span style="color: #333333;"> </span><b>sudo service apache2 restart</b><span style="color: #333333;">
</span><span style="color: #999999;"> Restarting web server apache2
waiting [ OK ]</span></code></pre>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Working with Horizon and multiple regions</span></h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">We are now ready to head out to our Horizon web-based dashboard and login. Point your browser at the URL of Horizon which will display the login page. On the login page you should now see a drop-down box which allows you to select the region you wish to log into -- either 'SoftLayer' or 'OpenStack' as shown below.</span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7fqDBuPJPnoDTwr7EFpZ1OQ9m-jq8dEkPCGem8qPeDoQnyCNcR3Z-yIXZYSUPcdbtS5lb1O5TzddS_j-Ot1JuuOG3UuklzZd_dJSD0zNSS-UobuBtoexzDZRpoVPk0U3-fyGxFOjjsiI/s1600/openstack-horizon-multi-region-login.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="OpenStack Horizon Multi-Region Login to SoftLayer" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7fqDBuPJPnoDTwr7EFpZ1OQ9m-jq8dEkPCGem8qPeDoQnyCNcR3Z-yIXZYSUPcdbtS5lb1O5TzddS_j-Ot1JuuOG3UuklzZd_dJSD0zNSS-UobuBtoexzDZRpoVPk0U3-fyGxFOjjsiI/s1600/openstack-horizon-multi-region-login.png" height="400" title="OpenStack Horizon Multi-Region Login to SoftLayer" width="313" /></a></div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">If you select to log into 'SoftLayer' you will need to provide your SoftLayer credentials where your password can be either your SoftLayer password or your SoftLayer API key. Likewise selecting 'OpenStack' logs you into your OpenStack deployment permitting you to manage resources directly in your native OpenStack installation.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Logging into the SoftLayer region populates the dashboard with SoftLayer resources for your account which are made available to Horizon by bridging through to SoftLayer using Jumpgate. For example on the 'Images' tab you can see a listing of all SoftLayer image templates available to your SoftLayer account as illustrated below.</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj019LZ-U8fJmXRRMUhTL7l0QpGWlQ3KLfgngHi8qxlRoL7qElzF0ewn4zksBBUSEs5CqMVYa_mbrXpVZvThtdtwEUEGDD7graeiyWovch28ec1_Qh5iSW9ULcPIEqXsd5bIl3PGN7089c/s1600/openstack-horizon-softlayer-images.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="OpenStack Horizon viewing SoftLayer images" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj019LZ-U8fJmXRRMUhTL7l0QpGWlQ3KLfgngHi8qxlRoL7qElzF0ewn4zksBBUSEs5CqMVYa_mbrXpVZvThtdtwEUEGDD7graeiyWovch28ec1_Qh5iSW9ULcPIEqXsd5bIl3PGN7089c/s1600/openstack-horizon-softlayer-images.png" height="170" title="OpenStack Horizon viewing SoftLayer images" width="400" /></a></div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Likewise you can browse and manage your SoftLayer compute server instances from the 'Instances' tab of OpenStack Horizon. In the screen shot below we've located the servers we booted earlier using the OpenStack nova CLI.</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM6X5VOUm8osRqPJTqbYq3ZrpLlIFLAUD8Il8bLD6eEq2GGOXBf3QqQNFvxYyjz6D7sm1Tm8nPJfsjTemLjqymqG0qo36tTFmcGh1-myrNDB2wQl8oGXgAW6-fYC2AG1Enf3l5rWD7pB0/s1600/openstack-horizon-softlayer-compute-servers.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="OpenStack Horizon viewing SoftLayer compute server instances" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM6X5VOUm8osRqPJTqbYq3ZrpLlIFLAUD8Il8bLD6eEq2GGOXBf3QqQNFvxYyjz6D7sm1Tm8nPJfsjTemLjqymqG0qo36tTFmcGh1-myrNDB2wQl8oGXgAW6-fYC2AG1Enf3l5rWD7pB0/s1600/openstack-horizon-softlayer-compute-servers.png" height="221" title="OpenStack Horizon viewing SoftLayer compute server instances" width="400" /></a></div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">At this point you are likely wondering what capabilities are available in the OpenStack Horizon dashboard for SoftLayer resources. Today, you can perform basic compute server instance and image management. For example you can boot, start, stop, reboot, view and snapshot SoftLayer based compute server instances via Horizon. From an image perspective you can view and delete SoftLayer based images. The exact capabilities available though Jumpgate are a point in time statement given that Jumpgate is a young project and new functionality is being added daily.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Let's boot a SoftLayer based image using Horizon. First navigate to the 'Images' tab of the Horizon dashboard and locate an image you wish to boot. Select the 'Launch' button for the image which will display the 'Launch Instance' dialog allowing you to specified properties for your server instance. Fill out the properties for your new server including a name, flavor, availability zone, etc.. A sample snapshot is shown below to illustrate this process.</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAdJsA3Tl5NkKIwWUFjaxThG_YM6WsWZ3Ra1I2rAtz9a8E-Ot-MW5clU8livx1WowWB0KXM6Ohzgm4lkSOLsLTznoO3KLfz0v8tTQO-awS7jlytA8qoTy7ypAZeyt_wfKjgmbRIpTtVI8/s1600/openstack-horizon-softlayer-boot-server.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="OpenStack Horizon boot SoftLayer compute instance" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAdJsA3Tl5NkKIwWUFjaxThG_YM6WsWZ3Ra1I2rAtz9a8E-Ot-MW5clU8livx1WowWB0KXM6Ohzgm4lkSOLsLTznoO3KLfz0v8tTQO-awS7jlytA8qoTy7ypAZeyt_wfKjgmbRIpTtVI8/s1600/openstack-horizon-softlayer-boot-server.png" height="366" title="OpenStack Horizon boot SoftLayer compute instance" width="400" /></a></div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Once you are satisfied with your new server's properties, select the 'Launch' button to provision the new server in SoftLayer. When the provisioning process starts you will be able to see your new server booting both from the OpenStack Horizon dashboard as well as in the SoftLayer dashboard.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Finally note that you can switch between your SoftLayer region and OpenStack region in the Horizon dashboard by selecting the drop-down menu in the upper right hand portion of Horizon. This permits a seamless transition between the Cloud regions you are managing from Horizon.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h2>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Wrapping up</span></h2>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Jumpgate is an API proxy which permits translation of OpenStack native APIs into SoftLayer infrastructure calls allowing you to use existing OpenStack componentry and tooling with the SoftLayer infrastructure. Using Jumpgate you can leverage the existing OpenStack python clients, CLIs and dashboard to rapidly deploy and manage compute server instances in the SoftLayer infrastructure. Moreover you can leverage Jumpgate as a framework to build OpenStack native API translations into your proprietary API.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">In this post we this post we introduced Jumpgate including an overview of its high level architecture and major components. We learned how to install and setup Jumpgate. We also introduced how you can use the OpenStack CLIs to managed SoftLayer based resources. And finally we setup and demo'd how you can use the OpenStack dashboard to manage SoftLayer and OpenStack resources from a single pane of glass.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<h2>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Related resources</span></h2>
<ul>
<li><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"><a href="https://github.com/softlayer/jumpgate">https://github.com/softlayer/jumpgate</a></span></li>
<li><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"><a href="http://softlayer.github.io/jumpgate/developer-guide/">http://softlayer.github.io/jumpgate/developer-guide/</a></span></li>
<li><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"><a href="http://www.softlayer.com/">http://www.softlayer.com/</a></span></li>
<li><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"><a href="http://api.openstack.org/api-ref.html">http://api.openstack.org/api-ref.html</a></span></li>
<li><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"><a href="http://en.wikipedia.org/wiki/Web_Server_Gateway_Interface">http://en.wikipedia.org/wiki/Web_Server_Gateway_Interface</a></span></li>
<li><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"><a href="http://gunicorn.org/">http://gunicorn.org/</a></span></li>
<li><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"><a href="http://wiki.nginx.org/Main">http://wiki.nginx.org/Main</a></span></li>
<li><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"><a href="http://wiki.nginx.org/NgxWSGIModule">http://wiki.nginx.org/NgxWSGIModule</a></span></li>
<li><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"><a href="http://devstack.org/">http://devstack.org/</a></span></li>
<li><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"><a href="http://upstart.ubuntu.com/cookbook/">http://upstart.ubuntu.com/cookbook/</a></span></li>
<li><a href="http://blog.softlayer.com/2009/1234567890" target="_blank"><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">http://blog.softlayer.com/2009/1234567890</span></a></li>
</ul>
<br />
<br />
<br />bodenhttp://www.blogger.com/profile/01576924395167177601noreply@blogger.comtag:blogger.com,1999:blog-8711250493465785199.post-12580230225966262332014-03-16T08:13:00.001-04:002014-06-27T08:35:56.856-04:00OpenStack nova VM migration (live and cold) call flow<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">OpenStack nova compute supports two flavors of Virtual Machine (VM) migration:</span><br />
<br />
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Cold migration -- migration of a VM which requires the VM to be powered off during the migrate operation during which time the VM is inaccessible.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Hot or live migration -- zero down-time migration whereupon the VM is not powered off during the migration and thus remains accessible.</span></li>
</ul>
<br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Understanding these VM migration operations from an OpenStack internals perspective can be a daunting task. I had the pleasure of digging into these flows in the latter part of 2013 and as part of that effort created a rough outline of the internal flows. Other's I've worked with found these flow outlines useful and thus they're provided below.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"></span><br />
<a name='more'></a><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Note -- The outlines below were created based on the OpenStack source in late 2013 and thus reflect the state of OpenStack at that point in time.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<br />
<div dir="ltr" style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<strong>Live Migration Flow:</strong></div>
<ul dir="ltr" style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/api/openstack/compute/contrib/admin_actions.py#L268" style="color: #1970b0; text-decoration: none;" target="_blank">nova.api.openstack.compute.contrib.admin_actions._migrate_live()</a></li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/compute/api.py#L2704" style="color: #1970b0; text-decoration: none;" target="_blank">nova.compute.api.live_migrate()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">update instance state to MIGRATING state</li>
<li style="margin: 0px !important;">call into scheduler to live migrate (scheduler hint will be set to the host select (which may be none)).</li>
</ul>
</li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/a2ab3836c0a66e1afebed9d4dfe02bd809366d4c/nova/scheduler/manager.py#L100" style="color: #1970b0; text-decoration: none;" target="_blank">nova.scheduler.manager.live_migration()</a></li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/a2ab3836c0a66e1afebed9d4dfe02bd809366d4c/nova/scheduler/manager.py#L131" style="color: #1970b0; text-decoration: none;" target="_blank">nova.scheduler.manager._schedule_live_migration()</a></li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/9331c5c1115c7d8cc5bcab71b1100eeea1ce72fe/nova/conductor/tasks/live_migrate.py#L48" style="color: #1970b0; text-decoration: none;" target="_blank">nova.conductor.tasks.live_migrate.LiveMigrationTask.execute()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">check that the instance is running</li>
<li style="margin: 0px !important;">check that the instance's host is up</li>
<li style="margin: 0px !important;">if destination host provided, check that it..<ol style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">is different than the instance's host</li>
<li style="margin: 0px !important;">is up</li>
<li style="margin: 0px !important;">has enough memory</li>
<li style="margin: 0px !important;">is compatible with the instance's host (i.e. hypervisor type and version)</li>
<li style="margin: 0px !important;">passes live migration checks (call using amqp rpc into nova manager check_can_live_migrate_destination)</li>
</ol>
</li>
<li style="margin: 0px !important;">else destination host not provided, find a candidate destination host and check that it...<ol style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">is compatible with the instance's host (i.e. hypervisor type and version)</li>
<li style="margin: 0px !important;">passes live migration checks (call using amqp rpc into nova manager check_can_live_migrate_destination)</li>
</ol>
</li>
<li style="margin: 0px !important;">call using amqp rpc into nova manager live_migration<br /><strong>Note: </strong>Migration data is initially set by check_can_live_migrate_destination and can be used for implementation specific parameters from this point.</li>
</ul>
</li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/compute/manager.py#L3598" style="color: #1970b0; text-decoration: none;" target="_blank">nova.compute.manager.check_can_live_migrate_destination()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">driver.check_can_live_migrate_destination()</li>
<li style="margin: 0px !important;">call using amqp rpc into nova manager check_can_live_migrate_source</li>
<li style="margin: 0px !important;">driver.check_can_live_migrate_destination_cleanup()</li>
</ul>
</li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/compute/manager.py#L3630" style="color: #1970b0; text-decoration: none;" target="_blank">nova.compute.manager.check_can_live_migrate_source()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">determine if the instance is volume backed and add result to the migration data</li>
<li style="margin: 0px !important;">driver.check_can_live_migrate_source()</li>
</ul>
</li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/compute/manager.py#L3707" style="color: #1970b0; text-decoration: none;" target="_blank">nova.compute.manager.live_migration()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">if block migration request then driver.get_instance_disk_info()</li>
<li style="margin: 0px !important;">call using amqp rpc into nova manager pre_live_migration<ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">Error handler: _rollback_live_migration</li>
</ul>
</li>
<li style="margin: 0px !important;">driver.live_migration()</li>
</ul>
</li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/compute/manager.py#L3652" style="color: #1970b0; text-decoration: none;" target="_blank">nova.compute.manager.pre_live_migration()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">get the block device information for the instance</li>
<li style="margin: 0px !important;">get the network information for the instance</li>
<li style="margin: 0px !important;">driver.pre_live_migration()</li>
<li style="margin: 0px !important;">setup networks on destination host by calling the network API setup_networks_on_host</li>
<li style="margin: 0px !important;">driver.ensure_filtering_rules_for_instance()</li>
</ul>
</li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/compute/manager.py#L3879" style="color: #1970b0; text-decoration: none;" target="_blank">nova.compute.manager._rollback_live_migration()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">update instance state to ACTIVE state</li>
<li style="margin: 0px !important;">re-setup networks on source host by calling the network API setup_networks_on_host</li>
<li style="margin: 0px !important;">for each instance volume connection call using amqp rpc into nova manager remove_volume_connection</li>
<li style="margin: 0px !important;">if block migration or volume backed migration without shared storage<ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">call using amqp rpc into nova manager rollback_live_migration_at_destination</li>
</ul>
</li>
</ul>
</li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/compute/manager.py#L3746" style="color: #1970b0; text-decoration: none;" target="_blank">nova.compute.manager._post_live_migration()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">driver.get_volume_connector()</li>
<li style="margin: 0px !important;">for each instance volume connection call the volume API terminate_connection</li>
<li style="margin: 0px !important;">driver.unfilter_instance()</li>
<li style="margin: 0px !important;">call into conductor to network_migrate_instance_start which will eventually call the network API migrate_instance_start</li>
<li style="margin: 0px !important;">call using amqp rpc into nova manager post_live_migration_at_destination</li>
<li style="margin: 0px !important;">if block migration or not shared storage driver.destroy()</li>
<li style="margin: 0px !important;">else driver.unplug_vifs()</li>
<li style="margin: 0px !important;">tear down networks on source host by calling the network API setup_networks_on_host</li>
</ul>
</li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/compute/manager.py#L3824" style="color: #1970b0; text-decoration: none;" target="_blank">nova.compute.manager.post_live_migration_at_destination()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">setup networks on destination host by calling the network API setup_networks_on_host</li>
<li style="margin: 0px !important;">call into conductor to network_migrate_instance_finish which will eventually call the network API migrate_instance_finish</li>
<li style="margin: 0px !important;">driver.post_live_migration_at_destination()</li>
<li style="margin: 0px !important;">update instance to ACTIVE state</li>
<li style="margin: 0px !important;">setup networks on destination host by calling the network API setup_networks_on_host</li>
</ul>
</li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/compute/manager.py#L3922" style="color: #1970b0; text-decoration: none;" target="_blank">nova.compute.manager.rollback_live_migration_at_destination()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">tear down networks on destination host by calling the network API setup_networks_on_host</li>
<li style="margin: 0px !important;">driver.destroy()</li>
</ul>
</li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/compute/manager.py#L3528" style="color: #1970b0; text-decoration: none;" target="_blank">nova.compute.manager.remove_volume_connection()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">call _detach_volume</li>
<li style="margin: 0px !important;">driver.get_volume_connector()</li>
<li style="margin: 0px !important;">remove the volume connection by calling the volume API terminate_connection</li>
</ul>
</li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/compute/manager.py#L3462" style="color: #1970b0; text-decoration: none;" target="_blank">nova.compute.manager._detach_volume()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">driver.detach_volume()<ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">Since the live migration failed the VM should not be on the destination host. So this should be a no-op.</li>
</ul>
</li>
<li style="margin: 0px !important;">If there is an exception detaching the volume then rollback the detach by calling the volume API roll_detaching</li>
</ul>
</li>
</ul>
<div dir="ltr" style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div dir="ltr" style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<strong>Cold Migration Flow:</strong></div>
<ul dir="ltr" style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/api/openstack/compute/servers.py#L1078" style="color: #1970b0; text-decoration: none;" target="_blank">nova.api.openstack.compute.servers._resize()</a></li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/api/openstack/compute/contrib/admin_actions.py#L116" style="color: #1970b0; text-decoration: none;" target="_blank">nova.api.openstack.compute.contrib.admin_actions._migrate()</a></li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/compute/api.py#L2108" style="color: #1970b0; text-decoration: none;" target="_blank">nova.compute.api.resize()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">if flavor_id is not passed, migrate host only and keep the original flavor</li>
<li style="margin: 0px !important;">else flavor_id is given, migrate host and resize to new flavor</li>
<li style="margin: 0px !important;">lookup the image for the instance by calling the image API show</li>
<li style="margin: 0px !important;">check quota headroom and reserve</li>
<li style="margin: 0px !important;">update instance to RESIZE_PREP state</li>
<li style="margin: 0px !important;">determine if the instance's current host should be ignored as a migration target and update filter properties for the scheduler accordingly</li>
<li style="margin: 0px !important;">call into scheduler to prep_resize</li>
</ul>
</li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/scheduler/manager.py#L165" style="color: #1970b0; text-decoration: none;" target="_blank">nova.scheduler.manager.prep_resize()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">call scheduler driver to schedule_prep_resize</li>
<li style="margin: 0px !important;">if no valid host was found then update instance to ACTIVE state and rollback quota reservation</li>
<li style="margin: 0px !important;">if error occurred then update instance to ERROR state and rollback quota reservation</li>
</ul>
</li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/scheduler/filter_scheduler.py#L130" style="color: #1970b0; text-decoration: none;" target="_blank">nova.scheduler.filter_scheduler.schedule_prep_resize()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">run through scheduler filters to select host</li>
<li style="margin: 0px !important;">call using amqp rpc into nova manager prep_resize</li>
</ul>
</li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/compute/manager.py#L2660" style="color: #1970b0; text-decoration: none;" target="_blank">nova.compute.manager.prep_resize()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">if no node specified call driver.get_available_nodes()</li>
<li style="margin: 0px !important;">call _prep_resize<ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">if an exception occurs then call into scheduler to prep_resize again if possible</li>
</ul>
</li>
</ul>
</li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/compute/manager.py#L2616" style="color: #1970b0; text-decoration: none;" target="_blank">nova.compute.manager._prep_resize()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">if same host is used then ensure that the same host is allowed (as per configuration)</li>
<li style="margin: 0px !important;">call using amqp rpc into nova manager resize_instance</li>
</ul>
</li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/compute/manager.py#L2737" style="color: #1970b0; text-decoration: none;" target="_blank">nova.compute.manager.resize_instance(</a>)<ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">get network and instance information</li>
<li style="margin: 0px !important;">update instance to RESIZE_MIGRATING state</li>
<li style="margin: 0px !important;">get block device information</li>
<li style="margin: 0px !important;">call driver.migrate_disk_and_power_off()</li>
<li style="margin: 0px !important;">call _terminate_volume_connections</li>
<li style="margin: 0px !important;">call into conductor to network_migrate_instance_start which will eventually call the network API migrate_instance_start</li>
<li style="margin: 0px !important;">update instance to RESIZE_MIGRATED state</li>
<li style="margin: 0px !important;">call using amqp rpc into nova manager finish_resize</li>
</ul>
</li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/compute/manager.py#L2792" style="color: #1970b0; text-decoration: none;" target="_blank">nova.compute.manager._terminate_volume_connections()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">if there is a volume connection to terminate<ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">driver.get_volume_connector()</li>
<li style="margin: 0px !important;">for each volume connection remove the connection by calling the volume API terminate_connection</li>
</ul>
</li>
</ul>
</li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/compute/manager.py#L2883" style="color: #1970b0; text-decoration: none;" target="_blank">nova.compute.manager.finish_resize()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">call _finish_resize</li>
<li style="margin: 0px !important;">if successful commit the quota reservation</li>
<li style="margin: 0px !important;">else rollback the quota reservation and update instance to ERROR state</li>
</ul>
</li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/compute/manager.py#L2800" style="color: #1970b0; text-decoration: none;" target="_blank">nova.compute.manager._finish_resize()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">if the flavor is changing then update the instance with the new flavor</li>
<li style="margin: 0px !important;">setup networks on destination host by calling the network API setup_networks_on_host</li>
<li style="margin: 0px !important;">call into conductor to network_migrate_instance_finish which will eventually call the network API migrate_instance_finish</li>
<li style="margin: 0px !important;">update instance to RESIZE_FINISHED state</li>
<li style="margin: 0px !important;">refresh and get block device information</li>
<li style="margin: 0px !important;">driver.finish_migration()</li>
<li style="margin: 0px !important;">update instance to RESIZED state</li>
</ul>
</li>
</ul>
<div dir="ltr" style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<strong>Cold migration confirm flow:</strong></div>
<ul dir="ltr" style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/api/openstack/compute/servers.py#L1018" style="color: #1970b0; text-decoration: none;" target="_blank">nova.api.openstack.compute.servers._action_confirm_resize()</a></li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/compute/api.py#L2008" style="color: #1970b0; text-decoration: none;" target="_blank">nova.compute.api.confirm_resize()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">reserve quota for decrease in resource usage</li>
<li style="margin: 0px !important;">call amqp rpc into nova manager confirm_resize</li>
</ul>
</li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/compute/manager.py#L2396" style="color: #1970b0; text-decoration: none;" target="_blank">nova.compute.manager.confirm_resize()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">tear down networks on source host by calling the network API setup_networks_on_host</li>
<li style="margin: 0px !important;">driver.confirm_migration()</li>
<li style="margin: 0px !important;">update instance to ACTIVE (or possibly STOPPED) state</li>
<li style="margin: 0px !important;">commit the quota reservation</li>
</ul>
</li>
</ul>
<div dir="ltr" style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<strong>Cold migration revert flow:</strong></div>
<ul dir="ltr" style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/api/openstack/compute/servers.py#L1035" style="color: #1970b0; text-decoration: none;" target="_blank">nova.api.openstack.compute.servers._action_revert_resize()</a></li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/compute/api.py#L1976" style="color: #1970b0; text-decoration: none;" target="_blank">nova.compute.api.revert_resize()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">reserve quota for increase in resource usage</li>
<li style="margin: 0px !important;">update instance task state to RESIZE_REVERTING</li>
<li style="margin: 0px !important;">call amqp rpc into nova manager revert_resize</li>
</ul>
</li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/compute/manager.py#L2460" style="color: #1970b0; text-decoration: none;" target="_blank">nova.compute.manager.revert_resize()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">tear down networks on destination host by calling the network API setup_networks_on_host</li>
<li style="margin: 0px !important;">call into conductor to network_migrate_instance_start which will eventually call the network API migrate_instance_start</li>
<li style="margin: 0px !important;">get block device information</li>
<li style="margin: 0px !important;">driver.destroy()</li>
<li style="margin: 0px !important;">call _terminate_volume_connections</li>
<li style="margin: 0px !important;">drop resize resources claimed on destination</li>
<li style="margin: 0px !important;">call amqp rpc into nova manager finish_revert_resize</li>
</ul>
</li>
<li style="margin: 0px !important;"><a href="https://github.com/openstack/nova/blob/master/nova/compute/manager.py#L2529" style="color: #1970b0; text-decoration: none;" target="_blank">nova.compute.manager.finish_revert_resize()</a><ul style="list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">update instance back to pre-resize values</li>
<li style="margin: 0px !important;">re-setup networks on source host by calling the network API setup_networks_on_host</li>
<li style="margin: 0px !important;">refresh and get block device information</li>
<li style="margin: 0px !important;">driver.finish_revert_migration()</li>
<li style="margin: 0px !important;">update instance to RESIZE_REVERTING state</li>
<li style="margin: 0px !important;">call into conductor to network_migrate_instance_finish which will eventually call the network API migrate_instance_finish</li>
<li style="margin: 0px !important;">update instance to ACTIVE (or possibly STOPPED) state</li>
<li style="margin: 0px !important;">commit the quota usage</li>
</ul>
</li>
</ul>
bodenhttp://www.blogger.com/profile/01576924395167177601noreply@blogger.comtag:blogger.com,1999:blog-8711250493465785199.post-54313348903979666952014-03-16T07:53:00.001-04:002014-06-27T08:36:14.669-04:00OpenStack nova boot server call diagram<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">The OpenStack architecture consists of multiple distributed services which often work together to carry out a single logical operation. Given the nature of this architecture, getting up to speed on the call flows and interactions can be a daunting task for developers and operational admins alike.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Not so long ago, I had to pleasure of digging into one of the more common flows in OpenStack nova compute -- the nova 'boot server' operation. As we all know the boot server operation provisions a new nova compute Virtual Machine (VM) on an underlying hypervisor such as KVM, ESXi, etc.. As part of the boot server operation, a number of OpenStack components are involved including:</span><br />
<br />
<a name='more'></a><br /><br />
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">REST API controllers.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">The nova compute scheduler.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Nova compute manager and virt driver (a per hypervisor component).</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Numerous OpenStack clients which interface with other OpenStack services (glance, neutron, etc.).</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Conductor for database persistence.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">RPC via AMQP.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">etc..</span></li>
</ul>
<br />
<span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">For a single boot server operation consider some of the high level logistics which must be carried out:</span><br />
<br />
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">A REST API controller must validate, sanitize and initiate a request operation.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">An initial 'shell' server must be persisted in the database (the operation is mostly async and thus a 'shell' server response must be returned to caller so they can poll status).</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">The scheduler must choose and reserve a hypervisor / host for the provision operation.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">A VM image must be downloaded from glance (if not already cached on the hypervisor) to boot the server from.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Volumes must often be allocated and realized from OpenStack Cinder.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Network related aspects must be allocated and realized.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">The VM must be booted, prepped and plugged (volume(s), network info, etc.).</span></li>
</ul>
<br />
<span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">The list given above is a very abstract and simplistic view provided to illustrate the complexity and breadth of operations which must occur to fulfill a single request. For this reason I found it easiest to visualize the components and interactions using a diagram which is provided below.</span><br />
<span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">The ad-hoc diagram below depicts the high level call flow of an OpenStack nova compute 'boot server' operation. In this diagram each of the boxes illustrate a major component of OpenStack and the lines represent interactions between components. </span><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">This diagram is not intended to show each and every interaction / operation, however it provides incite into the major operations and interactions which occur to full the provisioning of a new nova VM. Finally note this diagram was constructed in late July of 2013 and thus reflects the state of OpenStack at that point in time -- internals may have shifted.</span><br />
<br />
<br />
<h4>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Legend: Component (box) color coding</span></h4>
<div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none;"><colgroup><col width="74"></col><col width="263"></col></colgroup><tbody>
<tr style="height: 15px;"><td style="border: 1px solid #000000; padding: 2px 2px 2px 2px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Box Color</span></div>
</td><td style="border: 1px solid #000000; padding: 2px 2px 2px 2px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Component Type</span><span style="background-color: transparent; color: black; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></div>
</td></tr>
<tr style="height: 7px;"><td style="background-color: yellow; border: 1px solid #000000; padding: 2px 2px 2px 2px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Yellow</span></div>
</td><td style="border: 1px solid #000000; padding: 2px 2px 2px 2px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Controller classes for nova API</span></div>
</td></tr>
<tr style="height: 0px;"><td style="background-color: #f4cccc; border: 1px solid #000000; padding: 2px 2px 2px 2px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Pink</span></div>
</td><td style="border: 1px solid #000000; padding: 2px 2px 2px 2px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Nova scheduler classes</span></div>
</td></tr>
<tr style="height: 0px;"><td style="background-color: #5ae192; border: 1px solid #000000; padding: 2px 2px 2px 2px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Green</span></div>
</td><td style="border: 1px solid #000000; padding: 2px 2px 2px 2px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Nova manager (framework) classes</span></div>
</td></tr>
<tr style="height: 0px;"><td style="background-color: cyan; border: 1px solid #000000; padding: 2px 2px 2px 2px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Cyan</span></div>
</td><td style="border: 1px solid #000000; padding: 2px 2px 2px 2px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Nova virt driver (implemented per hypervisor type)</span></div>
</td></tr>
<tr style="height: 0px;"><td style="background-color: #b7b7b7; border: 1px solid #000000; padding: 2px 2px 2px 2px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Grey</span></div>
</td><td style="border: 1px solid #000000; padding: 2px 2px 2px 2px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Clients used by the various nova classes to interface with other services via REST API</span></div>
</td></tr>
<tr style="height: 0px;"><td style="background-color: #e06666; border: 1px solid #000000; padding: 2px 2px 2px 2px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Red</span></div>
</td><td style="border: 1px solid #000000; padding: 2px 2px 2px 2px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Other OpenStack services</span></div>
</td></tr>
</tbody></table>
</div>
<br />
<div>
<br />
<b id="docs-internal-guid-3924178c-ca95-d6e2-beb9-c7bd734eca91" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b><br />
<h4>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Legend: Interaction (line) color coding</span></h4>
<div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none;"><colgroup><col width="98"></col><col width="239"></col></colgroup><tbody>
<tr style="height: 15px;"><td style="border: 1px solid #000000; padding: 2px 2px 2px 2px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Line Type</span></div>
</td><td style="border: 1px solid #000000; padding: 2px 2px 2px 2px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Interaction Type</span><span style="background-color: transparent; color: black; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></div>
</td></tr>
<tr style="height: 7px;"><td style="border: 1px solid #000000; padding: 2px 2px 2px 2px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Solid black</span></div>
</td><td style="border: 1px solid #000000; padding: 2px 2px 2px 2px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Python API call</span></div>
</td></tr>
<tr style="height: 7px;"><td style="border: 1px solid #000000; padding: 2px 2px 2px 2px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Black dashed</span></div>
</td><td style="border: 1px solid #000000; padding: 2px 2px 2px 2px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">REST API call</span></div>
</td></tr>
<tr style="height: 7px;"><td style="border: 1px solid #000000; padding: 2px 2px 2px 2px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: magenta; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Reddish solid</span></div>
</td><td style="border: 1px solid #000000; padding: 2px 2px 2px 2px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">AMQP</span></div>
</td></tr>
</tbody></table>
</div>
<br />
<span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"></span>
</div>
<div>
<h4>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Diagram: OpenStack nova compute 'boot server' call flow</span></h4>
</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSUhGtGf9SBCDFFvWyexTRjKFwphbqEOnijcodi9G9FByzZk_IjGaU9QK2M-nzd7Jjo_WLR6MPYd_kmaQfBXswy33mUHcH2TpgXwu8qrSV3d1jtsv2nkkw2oxVWuXzM0KMszsuHw3pPOw/s1600/adhoc-nova-boot-havana-07192013.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSUhGtGf9SBCDFFvWyexTRjKFwphbqEOnijcodi9G9FByzZk_IjGaU9QK2M-nzd7Jjo_WLR6MPYd_kmaQfBXswy33mUHcH2TpgXwu8qrSV3d1jtsv2nkkw2oxVWuXzM0KMszsuHw3pPOw/s1600/adhoc-nova-boot-havana-07192013.png" height="324" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
bodenhttp://www.blogger.com/profile/01576924395167177601noreply@blogger.comtag:blogger.com,1999:blog-8711250493465785199.post-30515053559378447902014-03-13T13:06:00.000-04:002014-06-27T08:36:37.071-04:00OpenStack Keystone Workflow & Token Scoping<span style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px;">While recently browsing the OpenStack documentation updates for the Folsom release, I came across a new (new to me anyway) Keystone diagram which provides a well deserved depiction of a typical end-user workflow using Keystone as an identity service provider. This diagram not only provides greater incite to this typical workflow, but it also illustrates the notion of </span><em style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px;">scoped </em><span style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px;">vs </span><em style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px;">unscoped </em><span style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px;">tokens. I've pasted the diagram below for convenience, but the original document can be found on the </span><a href="http://docs.openstack.org/trunk/openstack-compute/admin/content/keystone-concepts.html" style="background-color: white; color: #1970b0; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; text-decoration: none;" target="_blank">OpenStack documentation site</a><span style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px;">.</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi59RG1EuVJzqko7okE5NMvcTxEwv4G4YhK_t1JZcRFv7_EEAFsqnCNscIEnAxBZmQT3Q6TorP_psQbHDN1OBwtKGNu3QDIBhi3dkObKp8vyziqRtESHbv7EejJocZmNVbtYW1BN2Sbc-Q/s1600/SCH_5002_V00_NUAC-Keystone.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi59RG1EuVJzqko7okE5NMvcTxEwv4G4YhK_t1JZcRFv7_EEAFsqnCNscIEnAxBZmQT3Q6TorP_psQbHDN1OBwtKGNu3QDIBhi3dkObKp8vyziqRtESHbv7EejJocZmNVbtYW1BN2Sbc-Q/s1600/SCH_5002_V00_NUAC-Keystone.png" height="281" width="400" /></a></div>
<br />
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
Although this diagram paints a nice picture of a typical workflow, it leaves a bit to the imagination in terms of which APIs are used for each step. Moreover some of the steps are a bit misleading depending on which token type scheme you are using with Keystone.</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
This post aims to further solidify the steps in the workflow diagram above.</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br />
<a name='more'></a><br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<b>NOTE:</b> This article was initially written in the later part of 2012 and thus is based on the state of OpenStack / Keystone at that point in time. Aspects of Keystone have changed since 2012, but this article's concepts should still apply. Enough folks found the article useful to maintain it -- hence it lives on here.</div>
<br />
<h2 style="background-color: white; border: none !important; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 1.6em; padding: 2px !important;">
Step 1: Obtain an unscoped token from Keystone</h2>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
To determine which tenants you have access to, you first need to use Keystone to obtain an <em>unscoped </em>token. By <em>unscoped </em>we mean the token is not tied to a particular tenant (soon to be called project) in the OpenStack Cloud. This <em>unscoped </em>token can be used to further query the Keystone service and determine which tenants you can access, but it should not be used with non-Keystone services such as the nova compute service -- only scoped tokens should be used with non-Keystone services.</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
To obtain an unscoped token, use the typical REST API for tokens, but do not specify a <span style="font-family: 'courier new', courier, monospace;">tenantName</span> in the request body.</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
For example:</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<strong><span style="color: navy;"><span style="font-family: 'courier new', courier, monospace;">POST http://localhost:5000/v2.0/tokens</span></span></strong></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<span class="sBrace structure-1" id="s-1" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-2" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"auth"</span><span class="sColon" id="s-3" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBrace structure-2" id="s-4" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-5" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"passwordCredentials"</span><span class="sColon" id="s-6" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBrace structure-3" id="s-7" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-8" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"username"</span><span class="sColon" id="s-9" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-10" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"boden"</span><span class="sComma" id="s-11" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-12" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"password"</span><span class="sColon" id="s-13" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-14" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"my9password"</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-3" id="s-15" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-2" id="s-16" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><br />
<span class="sBrace structure-1" id="s-17" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
Upon successful authentication, your response should look something like that pasted below. The token <span style="font-family: 'courier new', courier, monospace;">id </span>(hashbang path /<span style="font-family: 'courier new', courier, monospace;">access</span>/<span style="font-family: 'courier new', courier, monospace;">token</span>/<span style="font-family: 'courier new', courier, monospace;">id</span>) is your <em>unscoped </em>token. This token id should be use as the value for the <span style="font-family: 'courier new', courier, monospace;">X-Auth-Token</span> request header in subsequent requests to identity yourself.</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<span class="sBrace structure-1" id="s-1" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-2" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"access"</span><span class="sColon" id="s-3" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBrace structure-2" id="s-4" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-5" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"token"</span><span class="sColon" id="s-6" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBrace structure-3" id="s-7" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-8" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"expires"</span><span class="sColon" id="s-9" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-10" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"2012-10-06T18:23:11Z"</span><span class="sComma" id="s-11" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-12" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"id"</span><span class="sColon" id="s-13" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-14" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"MIICDgYJKoZIhvcNAQcCoIr8JKYG0ywOaMc2lYqhIQhLApqJpOns="</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-3" id="s-15" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><span class="sComma" id="s-16" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-17" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"serviceCatalog"</span><span class="sColon" id="s-18" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBrace structure-3" id="s-19" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-3" id="s-20" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><span class="sComma" id="s-21" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-22" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"user"</span><span class="sColon" id="s-23" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBrace structure-3" id="s-24" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-25" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"username"</span><span class="sColon" id="s-26" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-27" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"boden"</span><span class="sComma" id="s-28" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-29" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"roles_links"</span><span class="sColon" id="s-30" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBracket structure-4" id="s-31" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">[</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBracket structure-4" id="s-32" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">]</span><span class="sComma" id="s-33" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-34" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"id"</span><span class="sColon" id="s-35" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-36" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"0e982248b8a14e4bb838f956b9b79e7a"</span><span class="sComma" id="s-37" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-38" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"roles"</span><span class="sColon" id="s-39" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBracket structure-4" id="s-40" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">[</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBracket structure-4" id="s-41" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">]</span><span class="sComma" id="s-42" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-43" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"name"</span><span class="sColon" id="s-44" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-45" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"boden"</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-3" id="s-46" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-2" id="s-47" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><br />
<span class="sBrace structure-1" id="s-48" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<h2 style="background-color: white; border: none !important; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 1.6em; padding: 2px !important;">
Step 2: Discover tenants you have access to</h2>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
The next step is to use your <em>unscoped </em>token to determine which tenants you can access. Your tenancy is determined based on your role assignment -- for those tenants which you have an assigned role, you will have access to the tenant although your role may limit the operations you a perform for the given tenant in a given service endpoint. All operations (APIs) performed on a service endpoint should be performed with a <em>scoped </em>token.</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
To obtain a list of the tenants you have access to, use the <span style="font-family: 'courier new', courier, monospace;">GET /tenants</span> Keystone API passing in your unscoped token in the <span style="font-family: 'courier new', courier, monospace;">X-Auth-Token</span> header value.</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
For example:</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<strong style="color: navy;"><span style="font-family: 'courier new', courier, monospace;">GET http://localhost:5000/v2.0/tenants</span></strong></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<strong style="color: navy;"><span style="font-family: 'courier new', courier, monospace;">HEADERS["X-Auth-Token":"</span></strong><span style="color: navy;"><span style="font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; line-height: 18px; white-space: nowrap;">MIICDgYJKoZIhvcNAQcCoIr8JKYG0ywOaMc2lYqhIQhLApqJpOns=</span><strong><span style="font-family: 'courier new', courier, monospace;">"]</span></strong></span></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
The response from this call will include an array of tenants. For example the response shown below.</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<span class="sBrace structure-1" id="s-1" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-2" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"tenants"</span><span class="sColon" id="s-3" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBracket structure-2" id="s-4" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">[</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-3" id="s-5" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-6" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"description"</span><span class="sColon" id="s-7" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-8" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"Default Tenant"</span><span class="sComma" id="s-9" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-10" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"enabled"</span><span class="sColon" id="s-11" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-12" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">true</span><span class="sComma" id="s-13" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-60" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"id"</span><span class="sColon" id="s-61" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-62" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"6f8945f2d47f4abea149b7a0176b12a8"</span><span class="sComma" id="s-63" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-64" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"name"</span><span class="sColon" id="s-65" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-66" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"DefaultTenant"</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-3" id="s-67" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><span class="sComma" id="s-68" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-3" id="s-69" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-70" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"id"</span><span class="sColon" id="s-71" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-72" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"d25825b1c6aa4fbb9bfa9c0aa35e3f55"</span><span class="sComma" id="s-73" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-74" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"enabled"</span><span class="sColon" id="s-75" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-76" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">true</span><span class="sComma" id="s-77" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-78" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"description"</span><span class="sColon" id="s-79" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-80" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"Something"</span><span class="sComma" id="s-81" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-82" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"name"</span><span class="sColon" id="s-83" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-84" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"NewTenant"</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-3" id="s-85" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBracket structure-2" id="s-86" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">]</span><span class="sComma" id="s-87" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-88" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"tenants_links"</span><span class="sColon" id="s-89" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBracket structure-2" id="s-90" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">[</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBracket structure-2" id="s-91" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">]</span><br />
<span class="sBrace structure-1" id="s-92" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
Based on the list of tenants you have access to, determine which specific tenant you want to work with and obtain a <em>scoped </em>token for.</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<h2 style="background-color: white; border: none !important; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 1.6em; padding: 2px !important;">
Step 3: Obtain a scoped token</h2>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
Now that you have a list of tenants you can access and have determined which tenant you wish to work with, it's time to obtain a <em>scoped </em>token. A <em>scoped </em>token is a token which is tied to a specific tenant and provides metadata about that tenant and your roles within it. Only <em>scoped </em>tokens should be used when interfacing with a non-Keystone OpenStack service.</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
To obtain a <em>scoped </em>token, use the <span style="font-family: 'courier new', courier, monospace;">POST /tokens</span> Keystone API as in step 1. There are two forms of this API:</div>
<ul style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">Use the same request body as in step 1 passing in your user id and credentials, but this time specify a <span style="font-family: 'courier new', courier, monospace;">tenantName</span> to scope the token.</li>
<li style="margin: 0px !important;">Use a request body which contains both your <em>unscoped </em>token and the tenant name to <em>scope </em>the token. This later form allows you obtain a <em>scoped </em>token without POSTing your credentials again.</li>
</ul>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
Both forms of this API are shown below.</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<strong>Scope a token by resending credentials</strong></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<strong style="color: navy;"><span style="font-family: 'courier new', courier, monospace;">POST http://localhost:5000/v2.0/tokens</span></strong></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<span class="sBrace structure-1" id="s-1" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-2" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"auth"</span><span class="sColon" id="s-3" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBrace structure-2" id="s-4" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-5" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"tenantName"</span><span class="sColon" id="s-6" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-7" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"DefaultTenant"</span><span class="sComma" id="s-8" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-9" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"passwordCredentials"</span><span class="sColon" id="s-10" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBrace structure-3" id="s-11" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-12" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"username"</span><span class="sColon" id="s-13" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-14" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"boden"</span><span class="sComma" id="s-15" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-16" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"password"</span><span class="sColon" id="s-17" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-18" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"my9password"</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-3" id="s-19" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-2" id="s-20" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><br />
<span class="sBrace structure-1" id="s-21" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br />
<strong>Scope a token using your existing unscoped token</strong></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<strong style="color: navy;"><span style="font-family: 'courier new', courier, monospace;">POST http://localhost:5000/v2.0/tokens</span></strong></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<span style="color: #666666; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; line-height: 18px; white-space: nowrap;">{</span></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-2" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"auth"</span><span class="sColon" id="s-3" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBrace structure-2" id="s-4" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-5" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"tenantName"</span><span class="sColon" id="s-6" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-7" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"DefaultTenant"</span><span class="sComma" id="s-8" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-9" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"token"</span><span class="sColon" id="s-10" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBrace structure-3" id="s-11" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-12" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"id"</span><span class="sColon" id="s-13" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-14" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"MIICDgYJKoZIhvcNAQcCoIr8JKYG0ywOaMc2lYqhIQhLApqJpOns="</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-3" id="s-15" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-2" id="s-16" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><br />
<span class="sBrace structure-1" id="s-17" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
The response will include a new scoped token and associated metadata as shown in the example response below:</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<span class="sBrace structure-1" id="s-1" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-2" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"access"</span><span class="sColon" id="s-3" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBrace structure-2" id="s-4" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-5" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"token"</span><span class="sColon" id="s-6" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBrace structure-3" id="s-7" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-8" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"expires"</span><span class="sColon" id="s-9" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-10" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"2012-10-06T18:41:34Z"</span><span class="sComma" id="s-11" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-12" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"id"</span><span class="sColon" id="s-13" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-14" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"+dRsTPGAvw4yPrk-F7-eqcycJg"</span><span class="sComma" id="s-15" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-16" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"tenant"</span><span class="sColon" id="s-17" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBrace structure-4" id="s-18" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-19" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"description"</span><span class="sColon" id="s-20" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-21" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"Default Tenant"</span><span class="sComma" id="s-22" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-23" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"enabled"</span><span class="sColon" id="s-24" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-25" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">true</span><span class="sComma" id="s-26" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-73" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"id"</span><span class="sColon" id="s-74" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-75" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"6f8945f2d47f4abea149b7a0176b12a8"</span><span class="sComma" id="s-76" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-77" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"name"</span><span class="sColon" id="s-78" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-79" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"DefaultTenant"</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-4" id="s-80" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-3" id="s-81" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><span class="sComma" id="s-82" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-83" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"serviceCatalog"</span><span class="sColon" id="s-84" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBracket structure-3" id="s-85" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">[</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-4" id="s-86" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-87" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"endpoints_links"</span><span class="sColon" id="s-88" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBracket structure-5" id="s-89" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">[</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBracket structure-5" id="s-90" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">]</span><span class="sComma" id="s-91" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-92" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"endpoints"</span><span class="sColon" id="s-93" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBracket structure-5" id="s-94" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">[</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-6" id="s-95" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-96" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"adminURL"</span><span class="sColon" id="s-97" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-98" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"http://localhost:9292/v1"</span><span class="sComma" id="s-99" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-100" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"region"</span><span class="sColon" id="s-101" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-102" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"RegionOne"</span><span class="sComma" id="s-103" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-104" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"publicURL"</span><span class="sColon" id="s-105" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-106" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"http://localhost:9292/v1"</span><span class="sComma" id="s-107" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-108" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"internalURL"</span><span class="sColon" id="s-109" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-110" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"http://localhost:9292/v1"</span><span class="sComma" id="s-111" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-112" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"id"</span><span class="sColon" id="s-113" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-114" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"ef3aa115fa104a33914d1ba05a8a1195"</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-6" id="s-115" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBracket structure-5" id="s-116" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">]</span><span class="sComma" id="s-117" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-118" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"type"</span><span class="sColon" id="s-119" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-120" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"image"</span><span class="sComma" id="s-121" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-122" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"name"</span><span class="sColon" id="s-123" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-124" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"glance"</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-4" id="s-125" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><span class="sComma" id="s-126" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-4" id="s-127" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-128" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"endpoints_links"</span><span class="sColon" id="s-129" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBracket structure-5" id="s-130" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">[</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBracket structure-5" id="s-131" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">]</span><span class="sComma" id="s-132" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-133" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"endpoints"</span><span class="sColon" id="s-134" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBracket structure-5" id="s-135" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">[</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-6" id="s-136" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-137" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"adminURL"</span><span class="sColon" id="s-138" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-139" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"http://localhost:1337"</span><span class="sComma" id="s-140" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-141" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"region"</span><span class="sColon" id="s-142" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-143" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"RegionOne"</span><span class="sComma" id="s-144" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-145" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"publicURL"</span><span class="sColon" id="s-146" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-147" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"http://localhost:1337"</span><span class="sComma" id="s-148" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-149" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"internalURL"</span><span class="sColon" id="s-150" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-151" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"http://localhost:1337"</span><span class="sComma" id="s-152" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-153" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"id"</span><span class="sColon" id="s-154" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-155" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"ee855645535e422fb316ed3eb652d94c"</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-6" id="s-156" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBracket structure-5" id="s-157" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">]</span><span class="sComma" id="s-158" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-159" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"type"</span><span class="sColon" id="s-160" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-161" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"compute"</span><span class="sComma" id="s-162" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-163" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"name"</span><span class="sColon" id="s-164" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-165" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"local-node-js"</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-4" id="s-166" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><span class="sComma" id="s-167" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-4" id="s-168" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-169" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"endpoints_links"</span><span class="sColon" id="s-170" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBracket structure-5" id="s-171" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">[</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBracket structure-5" id="s-172" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">]</span><span class="sComma" id="s-173" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-174" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"endpoints"</span><span class="sColon" id="s-175" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBracket structure-5" id="s-176" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">[</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-6" id="s-177" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-178" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"adminURL"</span><span class="sColon" id="s-179" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-180" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"http://localhost:35357/v2.0"</span><span class="sComma" id="s-181" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-182" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"region"</span><span class="sColon" id="s-183" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-184" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"RegionOne"</span><span class="sComma" id="s-185" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-186" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"publicURL"</span><span class="sColon" id="s-187" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-188" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"http://localhost:5000/v2.0"</span><span class="sComma" id="s-189" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-190" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"internalURL"</span><span class="sColon" id="s-191" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-192" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"http://localhost:5000/v2.0"</span><span class="sComma" id="s-193" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-194" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"id"</span><span class="sColon" id="s-195" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-196" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"882ad7040d8e46ef9cd036b8f685bb33"</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-6" id="s-197" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBracket structure-5" id="s-198" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">]</span><span class="sComma" id="s-199" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-200" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"type"</span><span class="sColon" id="s-201" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-202" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"identity"</span><span class="sComma" id="s-203" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-204" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"name"</span><span class="sColon" id="s-205" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-206" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"keystone"</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-4" id="s-207" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBracket structure-3" id="s-208" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">]</span><span class="sComma" id="s-209" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-210" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"user"</span><span class="sColon" id="s-211" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBrace structure-3" id="s-212" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-213" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"username"</span><span class="sColon" id="s-214" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-215" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"boden"</span><span class="sComma" id="s-216" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-217" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"roles_links"</span><span class="sColon" id="s-218" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBracket structure-4" id="s-219" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">[</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBracket structure-4" id="s-220" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">]</span><span class="sComma" id="s-221" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-222" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"id"</span><span class="sColon" id="s-223" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-224" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"0e982248b8a14e4bb838f956b9b79e7a"</span><span class="sComma" id="s-225" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-226" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"roles"</span><span class="sColon" id="s-227" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBracket structure-4" id="s-228" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">[</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-5" id="s-229" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-230" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"name"</span><span class="sColon" id="s-231" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-232" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"member"</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-5" id="s-233" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBracket structure-4" id="s-234" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">]</span><span class="sComma" id="s-235" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-236" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"name"</span><span class="sColon" id="s-237" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-238" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"boden"</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-3" id="s-239" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><span class="sComma" id="s-240" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-241" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"metadata"</span><span class="sColon" id="s-242" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBrace structure-3" id="s-243" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">{</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-244" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"is_admin"</span><span class="sColon" id="s-245" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sObjectV" id="s-246" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">0</span><span class="sComma" id="s-247" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">,</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sObjectK" id="s-248" style="border: 0px; color: #36393b; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"roles"</span><span class="sColon" id="s-249" style="border: 0px; color: #333333; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">:</span><span class="sBracket structure-4" id="s-250" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">[</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sArrayV" id="s-251" style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">"9eaeea6cc78345738d3d7e12f6a9012e"</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBracket structure-4" id="s-252" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">]</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-3" id="s-253" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><br />
<span style="border: 0px; color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;"> </span><span class="sBrace structure-2" id="s-254" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span><br />
<span class="sBrace structure-1" id="s-255" style="border: 0px; color: #666666; cursor: pointer; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 18px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: nowrap;">}</span></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
Notice the token metadata in the response is now scoped to the <span style="color: black; font-family: 'andale mono', 'lucida console', Courier, 'Courier New', monospace; line-height: 18px; white-space: nowrap;">DefaultTenant </span>tenant which was specified in the API request. Moreover notice the response includes an array of <span style="font-family: 'courier new', courier, monospace;">service </span><span style="font-family: 'courier new', courier, monospace;">endpoints</span>. These endpoints identity the services your token has access to based on the service/endpoint catalog the Keystone service manages. As a consumer of the API, you now need to look through these service endpoints to determine which service you wish to use.</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
Let's quickly recap the main points of the endpoint/service catalog maintained by Keystone.</div>
<ul style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">Keystone manages a number of service definitions in its service catalog where a service is defined by a particular <span style="font-family: 'courier new', courier, monospace;">type </span>(for example <span style="font-family: 'courier new', courier, monospace;">compute</span>, <span style="font-family: 'courier new', courier, monospace;">image</span>, etc.), <span style="font-family: 'courier new', courier, monospace;">name</span>and <span style="font-family: 'courier new', courier, monospace;">description</span>. The service <span style="font-family: 'courier new', courier, monospace;">type </span>indicates the capabilities of the service and will ultimately determine which APIs are hosted for endpoints of the given service.</li>
<li style="margin: 0px !important;">Keystone also manages a number of endpoint definitions in its service catalog where an endpoint contains a set of base URLs as well as the <span style="font-family: 'courier new', courier, monospace;">region </span>where the endpoint resides. Region is typically associated with geographic location of the OpenStack Cloud hosting the endpoint and many deployments contain a Cloud per Region.</li>
<li style="margin: 0px !important;">Each endpoint is associated with a single service -- the endpoint's associated service provides a indication of the type of service the endpoint provides.</li>
<li style="margin: 0px !important;">Endpoint URLs are "base URLs" -- they provide the URL prefix to access the endpoint APIs. That said, actual API requests for a given endpoint are constructed by taking the endpoint base URL and appending the <a href="http://api.openstack.org/" style="color: #1970b0; text-decoration: none;" target="_blank">API URI</a> to it in order to form a full URL (i.e. <span style="font-family: 'courier new', courier, monospace;"><base_endpoint_url></span>/<span style="font-family: 'courier new', courier, monospace;"><openstack_api_uri></span>).</li>
</ul>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
With that in mind, we can see the response above contains a service/endpoint for <span style="font-family: 'courier new', courier, monospace;">compute </span>and <span style="font-family: 'courier new', courier, monospace;">identity</span>. This indicates that my scoped token can access APIs for the respective compute and identity services using the respective base endpoint URL given in the response. For more details on setting up services and endpoints in Keystone, see the <a href="http://docs.openstack.org/trunk/openstack-compute/install/apt/content/elements-of-keystone-service-catalog-entry.html" style="color: #1970b0; text-decoration: none;" target="_blank">OpenStack documentation</a>.</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<span style="color: red;"><strong>IMPORTANT </strong></span>Remember that you now need to use the scoped token id in subsequent API calls passing it in via the<span style="font-family: 'courier new', courier, monospace;"> X-Auth-Token</span> header.</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<h2 style="background-color: white; border: none !important; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 1.6em; padding: 2px !important;">
Step 4: Invoke the target endpoint service API</h2>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
You now have a <em>scoped </em>token and know the URL of the endpoint API you wish to invoke. The next step is to actually invoke the service endpoint itself for the API(s) you wish to use. The diagram shows the endpoint service in step 4 using Keystone to validate your token. While this is true if you are using UUID based tokens, it is not true if you are using <a href="http://wiki.openstack.org/PKI" style="color: #1970b0; text-decoration: none;" target="_blank">PKI</a>. Let's outline the main differences.</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<u><strong>UUID</strong></u></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
With UUID based tokens, your token ID will be a UUID -- a unique string used to identity the token you hold. In this scheme the Keystone service you obtained the token from maintains an index of token UUIDs to their respective metadata and validity. As this token ID does not contain embedded metadata, the endpoint service must invoke Keystone (passing along your UUID based token ID) to validate the given token is authenticated and valid. In response Keystone will return the metadata associated with the token (much like the metadata return in the response from step 3) including your roles, tenancy, etc. which can then be used internally by the service while processing your API request. The important thing to note here is that the endpoint service is calling into Keystone for each API request it handles to validate your UUID based token.</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<u>PKI</u></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
The <a href="http://wiki.openstack.org/PKI" style="color: #1970b0; text-decoration: none;" target="_blank">PKI token scheme</a> was introduced in OpenStack Folsom RC1 and removes the need for the endpoint service to call into Keystone for each request. The bullets below outline how PKI works in a nutshell.</div>
<ul style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; list-style-position: outside !important; margin-bottom: 0px; margin-top: 0px !important;">
<li style="margin: 0px !important;">PKI (<a href="http://en.wikipedia.org/wiki/Public-key_infrastructure" style="color: #1970b0; text-decoration: none;" target="_blank">Public Key Infrastructure</a>) is based on a public/private certificate pair using X.509 technology.</li>
<li style="margin: 0px !important;">Keystone holds both a public and private certificate.</li>
<li style="margin: 0px !important;">Anybody can get the public certificate from Keystone via REST API call, but the private certificate key is not exposed outside of the Keystone service itself.</li>
<li style="margin: 0px !important;">When using PKI, each of the endpoint services will ask Keystone (via REST API) for the public key the first time the service is invoked. The endpoint service will then save off the public key (caching it) for later use.</li>
<li style="margin: 0px !important;">When Keystone builds your token in PKI mode, it creates the token JSON object containing your token metadata, encrypts the JSON using the private key, and then creates a signature of the encrypted token using MD5. This encrypted/hashed token becomes your token ID which is returned upon successful authentication (step 3 response) and is then used in your <span style="font-family: 'courier new', courier, monospace;">X-Auth-Token</span> header. Take note that in this case your token ID includes the metadata for your token and not just a UUID as in the case of the UUID token scheme.</li>
<li style="margin: 0px !important;">When an endpoint service is invoked in PKI mode, it will verify the token signature and decrypt the token using the public key it has. Note that this is enough for the service to confirm validity since only Keystone has the private key and hence only Keystone could have encrypted the token using the private key.</li>
<li style="margin: 0px !important;">Since the decrypted token includes all the token metadata, the service no longer needs to invoke Keystone to get the token metadata and can validate the token internally.</li>
</ul>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
The important take away is that PKI is much performant than the UUID scheme since the endpoint service does not need to make a REST call into Keystone to validate the token on a per request basis. As such it can increase service performance and reduce network "chatter".</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
You can setup the token scheme in <span style="font-family: arial, helvetica, sans-serif;">your <span style="font-family: 'courier new', courier, monospace;">keystone.conf</span> by specifying the <span style="font-family: 'courier new', courier, monospace;">token_format</span> as <span style="font-family: 'courier new', courier, monospace;">PKI </span>and including the certificate paths required to carry out PKI by Keystone. The snippet below shows an example development configuration which uses the test certificate keys provided by the Keystone tests (used for ad-hoc testing). In a production environment your own certificate keys would be used.</span></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; word-wrap: break-word;">
<span style="font-family: 'courier new', courier, monospace;">[signing]</span></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; word-wrap: break-word;">
<span style="font-family: 'courier new', courier, monospace;">#token_format = UUID</span></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; word-wrap: break-word;">
<span style="font-family: 'courier new', courier, monospace;">certfile = /home/boden/workspaces/openstack/keystone/tests/signing/signing_cert.pem</span></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; word-wrap: break-word;">
<span style="font-family: 'courier new', courier, monospace;">keyfile = /home/boden/workspaces/openstack/keystone/tests/signing/private_key.pem</span></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; word-wrap: break-word;">
<span style="font-family: 'courier new', courier, monospace;">ca_certs = /home/boden/workspaces/openstack/keystone/tests/signing/cacert.pem</span></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; word-wrap: break-word;">
<span style="font-family: 'courier new', courier, monospace;">#key_size = 1024</span></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; word-wrap: break-word;">
<span style="font-family: 'courier new', courier, monospace;">#valid_days = 3650</span></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; word-wrap: break-word;">
<span style="font-family: 'courier new', courier, monospace;">#ca_password = None</span></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; word-wrap: break-word;">
<span style="font-family: 'courier new', courier, monospace;">token_format = PKI</span></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<h2 style="background-color: white; border: none !important; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 1.6em; padding: 2px !important;">
Step 5: Validate role metadata</h2>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
Step 5 is really about the endpoint service using you token's metadata to verify you can access the requested service/operation. This is often referred to as Role Base Access Control (RBAC) and involves the service using a 'rule engine' to determine you token contains the proper role access based on the service's respective <span style="font-family: 'courier new', courier, monospace;">policy.json</span> file. Although RBAC and concepts related to the <span style="font-family: 'courier new', courier, monospace;">policy.json</span> file are beyond the scope of this post, it's worth noting that each endpoint service contains its own policy which is enforced on a per service basis -- that is, the internals of each service validate RBAC. For more details on how RBAC works, there is a <a href="http://knowledgestack.wordpress.com/2012/01/27/rbac-keystone-and-openstack/" style="color: #1970b0; text-decoration: none;" target="_blank">good blog post on knowledgestack</a>. You can also check the OpenStack docs which document the contents of the <span style="font-family: 'courier new', courier, monospace;">policy.json</span> file on for each service type.</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
If you do not have the proper access to the operation you have requested, the service will deny your request and return an error.</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<h2 style="background-color: white; border: none !important; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 1.6em; padding: 2px !important;">
Step 6: Service API request</h2>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
In step 6, the endpoint service actually performs the operation you have requested as per the API URI. This might be a 'run instance', 'create volume', etc. depending on the API URI and service you are invoking. In the scheme of this post, there is nothing all that interesting to describe for this step.</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<h2 style="background-color: white; border: none !important; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 1.6em; padding: 2px !important;">
Step 7: Return response</h2>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
As you have probably guessed, step 7 returns an API response to the user. Again nothing interesting to dive into for this step in the context of this post.</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<h2 style="background-color: white; border: none !important; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 1.6em; padding: 2px !important;">
FAQ</h2>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<strong>Can I work with (use) an <em>unscoped </em>token outside of Keystone when I'm invoking APIs on service endpoints?</strong></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
It's not recommended -- almost all service implementations require a <em>scoped </em>token and therefore you will likely not get far using <em>unscoped </em>tokens.</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<strong>How do non-Keystone endpoint services know the token I'm using is PKI based vs UUID based?</strong></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
PKI based tokens are substantially larger in length than UUID based tokens as they contain the encrypted/signed token metadata whereas UUID based tokens are a fixed length string. Therefore the service checks the length of your token to determine.</div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
<strong>Can a single Keystone service manage multiple OpenStack Cloud deployments (regions)?</strong></div>
<div style="background-color: white; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12px; margin-bottom: 5px; margin-top: 5px; padding-bottom: 2px; padding-top: 2px;">
Yes and in fact this is somewhat common in order to provide a single identity access point for consumers. However keep in mind that multiple Keystone services can share the same data store which allows you to provide multiple Keystone APIs with a single backing store (for example to support geo based access). </div>
<br />bodenhttp://www.blogger.com/profile/01576924395167177601noreply@blogger.com